emeriks
Goto Top

DotNet - DataGridView mit eigener DataTable als DataSource

Hi,
in Anlehnung meiner anderen Frage von heute: DotNet - DatagridView - Hinzufügen von Zeilen langsam

Ich versuche jetzt eine Alternative. Zuerst eine DateTable aufbauen und diese einem DataGridView (DGV) als DataSource übergeben.

Mein Problem hier: Wie komme ich von der angezeigten Zelle zurück zum ursprünglichen Datenobjekt?

Bsp.:
Datenobjekt ist eine Klasse "EINS" mit Eigenschaften "Name" , "Ort", "ID"
Die DataTable hat nur eine Spalte. Die Zeilen dieser Tabelle demnach nur ein Feld. Dieses wird mit einer Instanz von EINS gefüllt. Damit das DGV dieses Objekte von EINS anzeigen kann, haben diese ToString implementiert und liefern einen "schönen" Anzeigename.

Wenn ich im DGV auf eine Zelle klicke, dann will ich aus dieser auf das Datenobjekt schlussfolgern. Ich bekomme aber immer nur den angezeigten Wert geliefert, nicht das zugrundeliegende Objekt.

Class EINS
    Public Property Name As String
    Public Property Ort As String
    Public Property ID As String

    Public Overrides Function ToString() As String
      Return String.Format("{0}, {1}", Me.Name, Me.Ort)  
    End Function
  End Class

 ... im Code  DGV = DataGridView
       
   Dim DT As New DataTable
   DT.Columns.Add("Objekt")  
   DT.Rows.Add(New EINS With {.Name = "Anton", .Ort ="Berlin", .ID = 1})  
   DT.Rows.Add(New EINS With {.Name = "Berta", .Ort = "Hamburg", .ID = 2})  
   DT.Rows.Add(New EINS With {.Name = "Delta", .Ort = "Köln", .ID = 3})  

   DGV.DataSource = DT

Bei einem Event habe ich RowIndex und ColumnIndex, kann also bestimmen, in welcher Zelle etwas passiert ist.

Frage: Wie komme ich von der DataGridViewCell zurück auf die dort angezeigte Instanz von EINS, z.B. damit ich die Eigenschaft ID dieser Instanz auslesen kann`?

E.

Content-Key: 422608

Url: https://administrator.de/contentid/422608

Printed on: April 16, 2024 at 18:04 o'clock

Member: godlie
godlie Feb 27, 2019 updated at 14:07:53 (UTC)
Goto Top
Hallo,
das lässt sich sehr einfach machen,

In deiner OnClick Mehthode wo du den RowIndex bekommst, kannst du dir ja die DataSource vom DGV nehmen und dort anhand des RowIndex ja einfach das Element herauspicken.

DataTable table;
    table = (DataTable) DGV.DataSource;
    DataRow row;

    // Get Row
    row = (DataRow)table.Rows[ROWINDEX];
Member: emeriks
emeriks Feb 27, 2019 at 13:08:07 (UTC)
Goto Top
Zitat von @godlie:
Danke, aber ich will nicht die Zeile haben, sondern das von der Zelle dargestellte Objekt.
In meinem Beispiel habe ich nur eine Spalte, um es zu vereinfachen. Es können aber auch mehrere Spalten sein.

Ich weiß, dass ich auch mit List(of MyClass) als DataSource arbeiten könnte, aber das geht in meinem Fall nicht, weil die Anzahl und die Namen der Spalten variable sind und ich deshalb dafür keine spezielle Klasse erstellen kann.
Member: godlie
godlie Feb 27, 2019 at 14:10:40 (UTC)
Goto Top
Was passiert denn wenn du dir die row mit einem Cast holst?
row =  (EINS)table.Rows[ROWINDEX];

Alternativ müsste es auch über einen GridView gehen, denn dort kannst du dir die Spatel auch Casten.
 private void gridView1_FocusedRowChanged(object sender, GridViewsBase.FocusedRowChangedEventArgs e) {
            GridView view = sender as GridView;
            EINS rec = view.GetRow(e.FocusedRowHandle) as EINS;
            Text = rec.ID;
        }