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

Ausgedruckt am: 29.03.2024 um 04:03 Uhr

Mitglied: godlie
godlie 27.02.2019 aktualisiert um 15:07:53 Uhr
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];
Mitglied: emeriks
emeriks 27.02.2019 um 14:08:07 Uhr
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.
Mitglied: godlie
godlie 27.02.2019 um 15:10:40 Uhr
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;
        }