2016-07-13 8 views
2

Ok Jungs, ich dachte, das wäre einfacher als es ist.So erhalten Sie Spalten in DataGridViewRowSelectedRowCollection

public static DataRowCollection ToRows(this DataGridViewSelectedRowCollection Rows) 
{ 
    DataTable table = new DataTable();    

    foreach (DataColumn column in Rows[0].DataGridView.Columns) 
    { 
     table.Columns.Add(column); 
    } 

    foreach (DataGridViewRow row in Rows) 
    { 
     DataRow newRow = ((DataRowView)row.DataBoundItem).Row; 
     table.ImportRow(newRow); 
    } 

    return table.Rows; 
} 

Ich versuche, die Spalten einer Zeile in einem DataGridViewSelectedRowCollection zu bekommen. Der obige Code löst einen InvalidCast-Fehler in der Tabelle.Column.Add (Spalte) aus, da versucht wird, DataGridViewColumns in DataTable-Spalten zu konvertieren. Ich habe keinen Zugriff auf DataGridView, da ich in einer statischen Methode bin, die die DataGridViewSelectedRowCollection erweitert und keinen Zugriff auf DataGridView hat.

Wie kann ich die columns-Auflistung in ein DataColumns-Objekt umwandeln?

+0

Wenn Sie sagen, was die Datenquelle von 'DataGridView' ist und warum brauchen Sie solche Datentabelle auf der erstellen Fliegen, vielleicht kann eine bessere Lösung vorgeschlagen werden. –

+0

Wie Sie sehen können, ist die Methode statisch und eine Erweiterung. Ich habe mehrere Raster, die in der Lage sein müssen, die ausgewählten Zeilen in einem Raster zu erhalten und die Zeilen an die aufrufende Aktualisierungsmethode zurückzugeben. Ich könnte das einfach in der Aufrufmethode tun, aber jedes Mal, wenn ich das machen möchte, muss ich den gleichen Code kopieren, was bedeutet, dass ich jedes Mal, wenn ich den Code an einem Ort aktualisiere, überall anders aktualisiert werden muss. –

+0

Sind alle Gitter an DataTables gebunden? Ist das Ziel, ausgewählte Datenzeilen aus einem Raster zu bekommen? –

Antwort

1

Sie können eine Erweiterungsmethode erstellen, um die Datenzeilen hinter ausgewählten Zeilen des Rasters auf diese Weise zurück:

public static class DataGridViewExtensions 
{ 
    public static List<DataRow> ToDataRows(this DataGridViewSelectedRowCollection Rows) 
    { 
     if (Rows == null || Rows.Count == 0) 
      return null; 

     return Rows.Cast<DataGridViewRow>() 
        .Where(x => x.DataBoundItem is DataRowView) 
        .Select(x => ((DataRowView)(x.DataBoundItem)).Row).ToList(); 
    } 
} 

Dann DataRow Werte aus einer row Variable vom Typ zu erhalten, betrachten Sie diese Optionen:

  • row.ItemArray enthält alle Spaltenwerte
  • row[index] den Wert einer Spalte durch einen Index erhält
  • row["column name"] erhält den Wert der Spalte für Spalte Name
  • row.Table.Columns enthält eine Liste von Spalten von DataTable
+0

Ich muss immer noch die Spalten später haben, so das ist in der Nähe, aber nicht das, was ich suche. –

+0

Was ist das Problem? Es scheint, dass Sie versucht haben, ausgewählte Datarows zu erhalten, wie Sie auch in Kommentaren erwähnt haben. –

+0

Verwenden von Datenentitäten zum Löschen von Datensätzen. Selbst wenn ich eine List