2014-02-17 107 views
7

我想将所有datagrid记录复制到datatable中而不使用任何循环。 对于防爆:如何将DataGrid转换为dataTable

Dim dt as New DataTable 
dt = Datagrid1.Items 

但这不是工作,并给了一个错误消息。

我的开发平台是Visual Studio 2010和语言是WPF与vb.net 4.0

回答

13

这是所有记录从DATAGRID转移到DATATABLE不使用LOOP的方式。

VB:

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

C#:

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

我m没有在C#datagrid上找到“ItemSource” –

+0

非常感谢 – Sonja

5

这取决于数据网格的填充方式。如果DataContext属性设置为DataTable,那么您可以简单地检索该值并将其转换为DataTable。

没有直接的方法将它从DataGrid元素转换为DataTable。

如果您想手动执行此操作,您必须创建DataTable的实例,然后使用循环从DataGrid中的Items中创建行。

0

我只是测试这一点,这个工程

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

为您的数据网格转换成蒙山头行的数据表,你可以按照这个步骤:

1)创建方法来检索单元格

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)通过全项修改并通过内容达达表“细胞”

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; 
      } 
     } 
    } 

记住使用这个方法,你必须将引用这个使用:

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

我得到了这个工作很好,但我不得不添加我自己的GetVisualChild和GetRow方法,因为它们不在这里发布。 – AndrewBenjamin

+0

抱歉忘记了,但正如您看到的,您可以轻松创建自己的方法来检索行和GetVisulaChild。 让我知道如果你想要我也发布这种方法 – luka