Entwickler-Ecke
WinForms - DataGridView Spalten per Programm filtern
maxx - Mo 05.04.10 19:46
Titel: DataGridView Spalten per Programm filtern
hello,
man kann doch im DataGridView Spalten umbenennen und filtern. Wie das mittels Mausklicks funktioniert, weiß ich. Ich würde das aber gerne im Programm machen.
Was muss ich programmieren, damit im DataGridView nur bestimmte Spalten angezeigt werden?
Beispiel:
Die übergebenen Daten könnten aus folgenden Spalten bestehen:
iId -> soll ignoriert, d. h. im DGV nicht angezeigt werden
sName -> soll im DGV angezeigt werden als: Name
sAdresse -> soll im DGV angezeigt werden als: Adresse
Weiß wer, wie das geht?
norman2306 - Mo 05.04.10 20:30
Ich schätze mal, deine Quelle ist mit DataBinding verlinkt?
Um etwas zu ignorieren, kannst du das [Browsable=false]-Attribute verwenden. Den Namen kannst du über das [DisplayName("ID")]-Attribute ändern. Wenn du die Spalten in einer bestimmten Reihenfolge sortieren möchtest, wird es etwas komplizierter. Das musst du selber managen.
Ich habe das selber mal mit Attributen und einer Überschreibung von BindingScource implementiert, den Code könnte ich dir morgen schicken. Alternativ kannst du einfach die Spalten selber schreiben, wenn du immer die gleiche Klasse als Source verwendest. Das wäre die einfachere Alternative.
maxx - Mo 05.04.10 22:54
Ob und wie ein DataBinding erfolgt, sollte egal sein. Mir ging es nur um die Darstellung der Daten im DataGridView.
Aber ich glaube, ich habe es schon gelöst. Muss man nur mal das alles händisch machen und sich dann den Quellcode in der Designer.cs anschauen. Dann habe ich das einfach nachprogrammiert :)
norman2306 - Di 06.04.10 08:15
C#-Quelltext
1:
| Ob und wie ein DataBinding erfolgt, sollte egal sein. Mir ging es nur um die Darstellung der Daten im DataGridView. |
1. Es ist nicht egal, ob DataBinding erfolgt. In dem Fall zeichnet sich die Tabelle samt Columns und Daten selber (außer man sagt explizit etwas anderes). Das heißt, man muss sich nicht um zeichnen bzw. das erstellen von Columns kümmern. Man kann es aber mit Hilfe von Attributen beeinflussen.
2. Wie DataBinding erfolgt? Wieviele Möglichkeiten gibt es da?
3. Mir ging es auch nur um die Darstellung der Daten. Da gibt es aber zwei Möglichkeiten:
- Man weiß nicht, was DataBinding ist und kümmert sich selber um alles
- Man weiß, was DataBinding ist, erspart sich die Arbeit, Fallbetrachtung etc. und macht es nicht selber
maxx - Di 06.04.10 08:35
Databinding hat damit zu tun, Datenquellen zu synchronisieren. Databinding hat also mit den Daten selbst zu tun.
Bei mir ging es aber nicht um die Daten, sondern einzig um deren Darstellung. Hierfür braucht man kein Binding. Einfach die Daten dem .DataSource übergeben, dann werden automatisch alle Header-Texte eingetragen. Allerdings bietet ein DataGridView die folgenden beiden Features:
- nicht alle Spalten anzeigen
- Spalten unter einem anderen Header-Text (Spaltenüberschrift) anzeigen
Das hast du ja auch unter 1) erwähnt.
Und diese beiden Features wollte ich im Programm nachbilden.
Hier meine Lösung:
- Hauptprogramm:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| DataGridViewTextBoxColumn _col0 = new DataGridViewTextBoxColumn(); _col0.DataPropertyName = "Id"; _col0.HeaderText = "xId"; _col0.Name = "_col0"; DataGridViewTextBoxColumn _col1 = new DataGridViewTextBoxColumn(); _col1.DataPropertyName = "Name"; _col1.HeaderText = "xName"; _col1.Name = "_col1"; this.dgvControl.SetDataTable ( dataTable, new DataGridViewColumn[] { _col0, _col1 } ); |
- Methode im dgvControl:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| public void SetDataTable(DataTable dataTable, DataGridViewColumn[] aDataGridViewColumn) { this.dataGridView.Columns.Clear(); this.dataGridView.Columns.AddRange(aDataGridViewColumn); this.dataGridView.AutoGenerateColumns = false;
this.dataGridView.DataSource = null; this.dataGridView.DataSource = dataTable; } |
norman2306 - Di 06.04.10 09:08
Jop, aber anstatt sich selber um das Zeichnen zu kümmern, kann man das anzuzeigende Objekt übergeben, und den jeweiligen Eigenschaften ein Attribute zuweisen, welches dem Grid verrät, wie es die Daten handeln soll:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| public class DataPoint { private string valueA; private bool valueB; private TimeSpan valueC; public DataPoint(string key) { valueA = key; }
[Browsable(false)] public string ValueA { get{ return valueA;} set{ valueA = value;} } [ReadOnly(true)] public bool ValueB { get{ return valueB;} set{ valueB = value;} } [DisplayName("ThasATimeSpan")] public TimeSpan ValueC { get{ return valueC;} set{ valueC = value;} } }
public class DPCollection : KeyedCollection<string, DataPoint> { public string GetKeyForItme(DataPoint item) { return item.ValueA; } } |
Wenn du diese Klasse mit DataBinding verwendest, brauchst du dich weder um das befüllen des DGV mit Daten zu kümmern, noch musst du direkt aus dem DGV auslesen und du musst dich auch nicht ums Zeichnen kümmern.
Wenn du es nun wie folgt dem DGV zuweist, entsteht ein DGV, bei dem Spalte 1 (ValueA) nicht zu sehen ist, Spalte 2 (ValueB) nicht Editierbar und Spalte3 hat die Überschirft "ThasATimeSpan".
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| private DPCollection dpc= new DPCollection();
public Form1() { dpc.Add(new DataPoint("ID1")); dpc.Add(new DataPoint("ID2")); dpc.Add(new DataPoint("ID3"));
dataGridView1.DataSource = dpc; } |
maxx - Di 06.04.10 12:30
Die Attribute kannte ich nicht. Interessant. Allerdings möchte ich die nicht verwenden. Aus folgenden Gründen:
1) Hier werden Schichten vermischt.
DataPoint ist in der Model-Schicht.
Der DataGridView ist in der View-Schicht.
[DisplayName("ThasATimeSpan")] ist anscheinend ein Attribut, was bewirken soll, dass "ValueC" im DGV als "ThasATimeSpan" angezeigt werden soll. D. h. im DataPoint wären Angaben, die jedoch zur View-Schicht gehören.
2) Verlust an Flexibilität (und auch wieder Schichten vermischt).
Ich vermute, dass die anderen beiden Attribute das Verhalten des DGV steuern. Dass vielleicht irgendein Property dann im DGV nicht angezeigt wird. Das will ich aber nicht. Es kann ohne weiteres sein, dass die Info mal angezeigt bekommen möchte, dass sie aber in einem anderen Fall ausgeblendet werden soll. Ich würde dann mittels dieser Attribute - falls ich die richtig verstanden habe - meine Möglichkeiten einschränken.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!