代码之家  ›  专栏  ›  技术社区  ›  NorCode

如何将DataGrid转换为dataTable

  •  10
  • NorCode  · 技术社区  · 12 年前

    我想在不使用任何循环的情况下将所有数据网格记录复制到数据表中。 对于Ex:

    Dim dt as New DataTable
    dt = Datagrid1.Items
    

    但这不起作用,并给出错误消息。

    我的开发平台是Visual studio 2010,语言是带有vb.net 4.0的WPF

    5 回复  |  直到 12 年前
        1
  •  18
  •   cramopy    10 年前

    这是在不使用LOOP的情况下将所有记录从DATAGRID传输到DATATABLE的方法。

    VB:

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

    C编号:

    DataTable dt = new DataTable();
    dt = ((DataView)DataGrid1.ItemsSource).ToTable();  
    
        2
  •  5
  •   Rob Aston    12 年前

    这取决于数据网格的填充方式。如果DataContext属性设置为DataTable,则只需检索该值并转换为DataTable即可。

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

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

        3
  •  2
  •   luka    6 年前

    要将dataGrid转换为具有标题行的数据表,可以执行以下步骤:

    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;
    

    这里有一个helper类来使用它。

     /// <summary>
    /// Class to help to retrive the Data Grid Contain
    /// </summary>
    public static class DataGridHelper
    {
        /// <summary>
        /// Retrive the cell contains
        /// </summary>
        /// <param name="dg">DataGrid</param>
        /// <param name="row">row</param>
        /// <param name="column">column</param>
        /// <returns>DataGrid Cell content</returns>
        static public DataGridCell GetCell(DataGrid dg, int row, int column)
        {
            DataGridRow rowContainer = GetRow(dg, row);
    
            if (rowContainer != null)
            {
                DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
    
                // try to get the cell but it may possibly be virtualized
                DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                if (cell == null)
                {
                    // now try to bring into view and retreive the cell
                    dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                    cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                }
                return cell;
            }
            return null;
        }
        /// <summary>
        /// Get row content
        /// </summary>
        /// <param name="dg">Datagrid</param>
        /// <param name="index">Index</param>
        /// <returns>DataGridRow</returns>
        static public DataGridRow GetRow(DataGrid dg, int index)
        {
            DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
            if (row == null)
            {
                // may be virtualized, bring into view and try again
                dg.ScrollIntoView(dg.Items[index]);
                row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
            }
            return row;
        }
        static T GetVisualChild<T>(Visual parent) where T : Visual
        {
            T child = default(T);
            int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < numVisuals; i++)
            {
                Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                child = v as T;
                if (child == null)
                {
                    child = GetVisualChild<T>(v);
                }
                if (child != null)
                {
                    break;
                }
            }
            return child;
        }
    }
    
        4
  •  0
  •   Nocturnal    12 年前

    我刚刚测试了这个,这个有效

    Dim dt as New DataTable
    dt = ctype(Datagrid1.Datasource, DataTable)
    
        5
  •  -1
  •   Community Mohan Dere    9 年前

    您必须在DataGrid上循环并将项添加到Datatable。下面的链接可能会有所帮助。

    DataGridView selected rows to DataTable