Autor Beitrag
maxx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: Mo 05.04.10 19:46 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Di 06.04.10 08:15 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: 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:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
// erste Spalte:
DataGridViewTextBoxColumn _col0 = new DataGridViewTextBoxColumn();
_col0.DataPropertyName = "Id";
_col0.HeaderText = "xId";
_col0.Name = "_col0"// braucht man nicht unbedingt

// zweite Spalte:
DataGridViewTextBoxColumn _col1 = new DataGridViewTextBoxColumn();
_col1.DataPropertyName = "Name";
_col1.HeaderText = "xName";
_col1.Name = "_col1"// braucht man nicht unbedingt

// alles übergeben:
this.dgvControl.SetDataTable
(
   dataTable, // DataTable mit den eigentlichen Daten
   new DataGridViewColumn[] 
   {
      _col0,
      _col1
   }
);


- Methode im dgvControl:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
public void SetDataTable(DataTable dataTable, DataGridViewColumn[] aDataGridViewColumn)
{
   // Daten im DataGridView anzeigen

   // Spaltenüberschriften:
   this.dataGridView.Columns.Clear(); 
   this.dataGridView.Columns.AddRange(aDataGridViewColumn);
   this.dataGridView.AutoGenerateColumns = false;

   // Inhalte:
   this.dataGridView.DataSource = null;
   this.dataGridView.DataSource = dataTable;
}
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: 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:

ausblenden volle Höhe 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".

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: 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.