Laden...

DataGridView - Manuelle Datenbindung & Spalten-Reihenfolge

Erstellt von skaface vor 17 Jahren Letzter Beitrag vor 17 Jahren 4.743 Views
skaface Themenstarter:in
245 Beiträge seit 2005
vor 17 Jahren
DataGridView - Manuelle Datenbindung & Spalten-Reihenfolge

Ich möchte ein bestehendes Programm von mir momentan ein wenig besser strukturieren (Daten von Code kapseln und quasi ein ordentliches MVC-Konzept aufbauen), was mich auch dazu führt, dass ich meine Datenbindung nicht mehr automatisch (über den Forms-Designer) sondern per Hand durchführen muss.

Nun habe ich zB. ein DataGridView mit 4 Spalten angelegt (Datum, Text, Wert, Kassa). Alle Spalten sind natürlich vorerst mal "unbound".

Will ich nun die Daten binden, führe ich folgenden Code aus:


BindingSource bindingSourceCostCenter = new BindingSource(fcDataSet, "CostCenter");
dataGridViewSearchResult.DataSource = bindingSourceCostCenter;

DataGridViewColDate.DataPropertyName = "Date";
DataGridViewColText.DataPropertyName = "Text";
DataGridViewColValue.DataPropertyName = "Value";
DataGridViewColCreditDepot.DataPropertyName = "CreditDepot";

Nun geschieht leider das unvermeidbare (was ich von Anfang an befürchtet habe):
Dem DataGridView werden, zusätzlich zu den bereits vorhandenen 4, alle Spalten der Source-DataTable hinzugefügt.

Die vorhandenen 4 Spalten sind schon mit den richtigen Daten gebunden und zeigen diese auch an, deshalb arbeite ich Momentan mit einem kleinen workaround, der leider nicht sehr schön ist:

Ich gebe jeder der von mir gewollten Spalten den Namen "DataGridViewColXXX" (XXX -> Spaltenname) und mache nach dem Binden einfach alle Spalten unsichtbar, die nicht mit "DataGridViewCol" beginnen:


foreach (DataGridViewColumn col in dataGridViewSearchResult.Columns)
    if (!col.Name.StartsWith("DataGridViewCol"))
        col.Visible = false;

Das kann ja nicht die einzige Lösung sein, also wie kann man das beheben?

Noch eine 2. Frage zum DataGridView:

Ich arbeite mit einem selbst abgeleiteten DataGridView, da ich zB. die Spaltenüberschriften ein wenig anders darstellen will. Nun muss ich beim OnPaint alle sichtbaren Spalten durchgehen und brauche zum Zeichnen die jeweilige Spaltenbreite, damit ich die "Position" der nächsten errechnen kann, also in etwa:


int xLoc = base.ClientRectangle.X + 1;

for (int i = 0; i < base.Columns.Count - 1; i++)
{
    if (base.Columns[i].Visible)
    {
        xLoc += base.Columns[i].Width;
        // Meine Zeichenoperationen ....

        // Zu testzwecken
        Console.WriteLine(base.Columns[i].Index + ": " + base.Columns[i].Name);
    }
}

Das Problem ist nun, dass ich hier beim Testen festgestellt habe, dass die Reihenfolge der Ausgegebenen Spaltennamen nicht immer der angezeigten Reihenfolge entspricht.

Das Problem ist mir vor allem aufgefallen, bevor ich alle sichtbaren Spalten mittels zuweisung von "DataPropertyName" gebunden habe. Nach dem binden, wurden die sichtbaren Spalten in der richtigen Reihenfolge ausgegebenen...

Wonach richtet sich nun die Reihenfolgen der internen Speicherung, wenn nicht nach der Ansicht?

danke, mfg

mike

D
280 Beiträge seit 2005
vor 17 Jahren

Moin,

unter .NET 1.1 habe ich das erste Problem mit Hilfe der DataGridTableStyle Klasse gelöst.

DataGridTextBoxColumn ColumnIndex =	new DataGridTextBoxColumn();
ColumnIndex.MappingName =	     "Nr.";
ColumnIndex.HeaderText =	"Nr.";
ColumnIndex.Width =	(int)grfx.MeasureString("Nr.i13", this.MeasChartDataGrid.Font).Width-1;

DGStyle.MappingName = "DT"; //DT war der TableName der DataTable
DGStyle.GridColumnStyles.Add(ColumnIndex);
DGStyle.DataGrid = this.MeasChartDataGrid;
			
//Spaltendesign und DataTable als Quelle an das DataGrid binden
this.MeasChartDataGrid.TableStyles.Add(DGStyle);
this.MeasChartDataGrid.SetDataBinding(myDT,"");
this.MeasChartDataGrid.EndInit();

MappingName und HeaderText der DataGridTextBoxColumn entsprachen dabei genau dem Namen der Columns in meinem DataTable.

Hoffe dir hilft das weiter.

Zum zweiten Problem kann ich keine Auskunft geben.

gruss
dschmoegner

Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007

skaface Themenstarter:in
245 Beiträge seit 2005
vor 17 Jahren

Ich arbeite mit .NET 2.0, und dem DataGridView und nicht mit dem DataGrid (welches es denke ich gar nicht mehr gibt...).

Leider kann ich keine entsprechenden Methoden zum DataGridTableStyle im DataGridView finden...

danke, mfg

D
280 Beiträge seit 2005
vor 17 Jahren

Ich entschuldige mich. Bin es immernoch gewohnt die installierte MSDN vom VS 03 zu verwenden, oder besser gesagt ich verwende sie manchmal noch aus Gewohnheit.

Wenn es dich nicht stört würde ich die Columnsauflistung aus dem DataGridView herausnehmen. Durch das Binding werden die Columns aus dem DataSet ja eh in die DataGridView übernommen.

gruss
dschmoegner

Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007

skaface Themenstarter:in
245 Beiträge seit 2005
vor 17 Jahren

Das könnte ich natürlich schon machen, allerdings müsste ich dann auch alle Eigenschaften der Columns händisch ändern, was ich eigentlich ganz gerne vermeiden würde...

Wenn wirklich niemand eine andere Idee hat, werde ich wohl entweder mit meiner Lösung leben und einfach alle "ungewünschten" Spalten ausblenden, oder die Spalten wirklich im Designer leer lassen und erst zur Laufzeit die benötigten Einstellungen vornehmen (obwohl das eigentlich nicht viele Vorteile bringt, da ich ja erst wieder die überflüssigen Spalten ausblenden muss...).
Einziger Vorteil, den ich hier sehe, wäre jener, dass ich 4 Spalten weniger habe, als zuvor (da diese ja nach der Bindung doppelt vorhanden waren), was meiner Meinung nach, aber ziemlich vernachlässigbar ist...

F
10.010 Beiträge seit 2004
vor 17 Jahren

Zu 1.
dgv.AutoGenerateColumns = false;

zu 2.
dgv.Columns_.Index

D
280 Beiträge seit 2005
vor 17 Jahren

Original von FZelle
Zu 1.
dgv.AutoGenerateColumns = false;

zu 2.
dgv.Columns_.Index

Die Welt kann manchmal so einfach sein. Sich dat Brett vorm Kopf zu entfernen versucht =)

Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007

skaface Themenstarter:in
245 Beiträge seit 2005
vor 17 Jahren

Original von FZelle
Zu 1.
dgv.AutoGenerateColumns = false;

zu 2.
dgv.Columns_.Index

Ok, vielen dank!

Jetzt wo ich "AutoGenerateColumns" gelesen habe, ist mir auch wieder eingefallen, dass ich das selbe Problem schonmal hatte, aber damals sogar selbst daraufgekommen bin 😉

Zum 2. Punkt:

Hab gerade noch ein wenig probiert und konnte das verhalten nicht mehr rekonstruieren. Keine Ahnung, was da schief gelaufen ist, auf jeden Fall funktioniert das ganze jetzt so, wie es soll (in meinem Anfangs-Posting habe ich auch bereits die Index-Eigeneschaft verwendet, was aber nicht funktioniert hat...)

danke, mfg