2014-02-17 7 views
7

Ich möchte alle DataGrid-Datensätze in Datentabelle ohne Verwendung einer Schleife kopieren. Für Ex:So konvertieren Sie DataGrid in DataTable

Dim dt as New DataTable 
dt = Datagrid1.Items 

Aber das funktioniert nicht und eine Fehlermeldung zu geben.

Meine Entwicklungsplattform ist Visual Studio 2010 und Sprache ist WPF mit vb.net 4.0

Antwort

13

Dies ist der Weg, um alle Aufzeichnungen von Datagrid Datatable zu übertragen, ohne die Schleife.

VB:

Dim dt As New DataTable 
dt = CType(DataGrid1.ItemsSource, DataView).ToTable 

C#:

DataTable dt = new DataTable(); 
dt = ((DataView)DataGrid1.ItemsSource).ToTable(); 
+2

I‘ Ich finde "ItemSource" auf einem C# -Datagrid –

+0

funktioniert perfekt Dank – Sonja

5

Es hängt davon ab, wie das Datagrid bevölkert ist. Wenn die DataContext-Eigenschaft auf eine DataTable festgelegt ist, können Sie diesen Wert einfach abrufen und in eine DataTable umwandeln.

Es gibt keine direkte Methode, um dies vom DataGrid-Element in eine DataTable zu konvertieren.

Wenn Sie dies manuell tun möchten, müssten Sie eine Instanz der DataTable erstellen und dann die Zeilen aus den Items im DataGrid mithilfe einer Schleife erstellen.

0

ich dies gerade getestet und das funktioniert

Dim dt as New DataTable 
dt = ctype(Datagrid1.Datasource, DataTable) 
1

Um Ihre Datagrid in Datentabelle whith Kopfzeile konvertieren können Sie diese Schritte durchführen:

1) schaffen die Methode zum Retrive der Zelle

static public DataGridCell GetCell(DataGrid dg, int row, int column) 
    { 
     DataGridRow rowContainer = GetRow(dg, row); 

     if (rowContainer != null) 
     { 
      DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer); 
      DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
      if (cell == null) 
      { 
       dg.ScrollIntoView(rowContainer, dg.Columns[column]); 
       cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
      } 
      return cell; 
     } 
     return null; 
    } 

2) eine Iteration durch alle Elemente und übergeben den Inhalt dada Tabelle „Zelle“

private void DataGridToDataTable() 
    { 
     DataTable dt = new DataTable(); 
     var j = byte.MinValue;//header row handler 
     dt.Rows.Add(); 
     foreach (DataGridColumn column in dataGrid1.Columns) 
     {     
      dt.Columns.Add(column.GetValue(NameProperty).ToString()); 
      dt.Rows[byte.MinValue][j++] = column.Header; 
     } 

     //data rows handler 
     for (int i = byte.MinValue ; i < dataGrid1.Items.Count; i++) 
     { 
      dt.Rows.Add(); 
      for (j = Byte.MinValue; j < dataGrid1.Columns.Count; j++) 
      { 
       DataGridCell dgc = GetCell(dataGrid1, i, j); 
       dt.Rows[i + 1][j] = ((dgc.Content) as TextBlock).Text; 
      } 
     } 
    } 

Denken Sie daran, diese Methoden verwenden Sie diese verwenden wird verweisen muss:

using System.Windows.Media; 
using System.Data; 
using System.Windows.Controls; 
using System.Windows.Controls.Primitives; 
+0

Ich habe das funktioniert gut, aber ich musste meine eigenen GetVisualChild und GetRow-Methoden hinzufügen, weil sie hier nicht veröffentlicht sind. – AndrewBenjamin

+0

Sorry vergessen, aber wie Sie sehen, ist es einfach, eine eigene Methode zum Abrufen von Zeilen und GetVisulaChild zu erstellen. Lassen Sie mich wissen, wenn Sie wollen, dass ich diese Methoden auch gepostet habe – luka

Verwandte Themen