如何将 DataTable 绑定到 Datagrid

Posted

技术标签:

【中文标题】如何将 DataTable 绑定到 Datagrid【英文标题】:How to bind DataTable to Datagrid 【发布时间】:2014-01-13 06:14:02 【问题描述】:

我在将DataTable 绑定到DataGrid 时遇到问题。我已经寻找解决方案,但无法摆脱错误。 绑定在使用 WindowsForms 时工作正常,所以 DataTable 是正确的。我只是无法将它绑定到 WPF-DataGrid。

错误消息: AmbiguousMatchException 未处理 来源:mscorlib

我已经建立了新项目来摆脱任何不良链接等。

XAML 代码:

<DataGrid x:Name="grid1" Margin="10" ItemsSource="Binding" 
          AutoGenerateColumns="True"></DataGrid>

我已经尝试过后面的 C#-Code:

grid1.ItemsSource = dt.DefaultView;

grid1.DataContext = dt.DefaultView;

grid1.DataContext = dtex;

感谢任何帮助。

【问题讨论】:

显示您的DataTable 结构。此外,如果您从后面的代码中执行此操作,则无需在 xaml 中设置 ItemsSource DataTable 是通过 SQLDataAdapter 填充的。表格已填满,因为我使用表格的值进行计算。导出方法也可以正常工作。它只是对 WPFDataGrid 的绑定。 【参考方案1】:

在cs文件中:

    private DataTable _dataTable;

    public DataTable DataTable
    
        get  return _dataTable; 
        set  _dataTable = value; 
    

    private void Window_Loaded(object sender, RoutedEventArgs e)
    
        this._dataTable = new DataTable("table");

        this._dataTable.Columns.Add("col0");
        this._dataTable.Columns.Add("col1");
        this._dataTable.Columns.Add("col2");

        this._dataTable.Rows.Add("data00", "data01", "data02");
        this._dataTable.Rows.Add("data10", "data11", "data22");
        this._dataTable.Rows.Add("data20", "data21", "data22");

        this.grid1.DataContext = this;

    

在 Xaml 文件中:

<DataGrid x:Name="grid1"
          Margin="10"
          AutoGenerateColumns="True"
          ItemsSource="Binding Path=DataTable, Mode=TwoWay" />

【讨论】:

这相当于OP发布的问题。问题出在他绑定的 DataTable 中。 我在一个单独的类中有一个方法,它返回一个数据表。 table1 = myClassInstance.myMethod(); MessageBox 显示 table1 有 4 列和几行。然后我想将 table1 绑定到 WPF 中的 DataGrid。【参考方案2】:

在cs文件中

DataTable employeeData = CreateDataTable();
gridEmployees.DataContext = employeeData.DefaultView;

在 xaml 文件中

<DataGrid Name="gridEmployees" ItemsSource="Binding">

【讨论】:

这在 WPF 中似乎对我有用 - 问题是,为什么 Visual Studio 在执行此操作时不自动为我调整 XAML?【参考方案3】:

正如Rohit Vats 在他的Comment 中提到的那样,我期待您的DataTable 中的结构错误。

试试这样的:

  var t = new DataTable();

  // create column header
  foreach ( string s in identifiders ) 
    t.Columns.Add(new DataColumn(s)); // <<=== i'm expecting you don't have defined any DataColumns, haven't you?
  

  // Add data to DataTable
  for ( int lineNumber = identifierLineNumber; lineNumber < lineCount; lineNumber++ ) 
    DataRow newRow = t.NewRow();
    for ( int column = 0; column < identifierCount; column++ ) 
      newRow[column] = fileContent.ElementAt(lineNumber)[column];
    
    t.Rows.Add(newRow);
  

  return t.DefaultView;

我在 ValueConverter 中使用了这个 DataTable,它的作用就像一个具有以下绑定的魅力。

xaml:

 <DataGrid AutoGenerateColumns="True" ItemsSource="Binding Path=FileContent, Converter=StaticResource dataGridConverter" />

那么它的作用是,ValueConverter 将我的有界数据(无论它是什么,在我的情况下是List&lt;string[]&gt;)转换为DataTable,如上面的代码所示,并将此DataTable 传递给DataGrid。使用指定的数据列,数据网格可以生成所需的列并将它们可视化。

简而言之,在我的情况下,绑定到 DataTable 就像一个魅力。

【讨论】:

直到有人想出一种更优雅的(语法糖,有人吗?)方法将 expando 对象绑定到 PODG(普通的 ol' 数据网格),我将使用数据表方法。易于设置,易于数据绑定。 据我研究,.NET 4.0 中没有更优雅的解决方案可以将 可缩放 列 DataTable 绑定到 DataGrid。网络上有足够多的示例来绑定 fixed 列表。也许微软会在以后的版本中提供一种方法。【参考方案4】:
using (SqlCeConnection con = new SqlCeConnection())
   
   con.ConnectionString = connectionString;
   con.Open();
   SqlCeCommand com = new SqlCeCommand("SELECT S_no,Name,Father_Name")
   SqlCeDataAdapter sda = new SqlCeDataAdapter(com);
   System.Data.DataTable dt = new System.Data.DataTable();
   sda.Fill(dt);
   dataGrid1.ItemsSource = dt.DefaultView;
   dataGrid1.AutoGenerateColumns = true;
   dataGrid1.CanUserAddRows = false;
   

【讨论】:

能否请您详细说明您的答案,添加更多关于您提供的解决方案的描述? 通过添加dataGrid1.AutoGeberateColumns=true;我们将在数据网格上获得 o/p 否则它不会显示 o/p AutoGenerateColumns 的默认值为 true。所以这条线并不是真正需要的。【参考方案5】:

您可以在 WPF 中使用 DataGrid

SqlDataAdapter da = new SqlDataAdapter("Select * from Table",con);
DataTable dt = new DataTable("Call Reciept");
da.Fill(dt);
DataGrid dg = new DataGrid();
dg.ItemsSource = dt.DefaultView;

【讨论】:

第一句话说:“我在将DataTable 绑定到DataGrid 时遇到问题。” 他确实使用了 DataGrid从 OPs 的问题可以看出,这句话的意义何在? 我的 DataGrid 没有 ItemsSource 但有 DataContext。我该怎么办?【参考方案6】:

在 .cs 文件中

grid.DataContext = table.DefaultView;

在 xaml 文件中

<DataGrid Name="grid" ItemsSource="Binding">

【讨论】:

【参考方案7】:

我会这样做:

grid1.DataContext = dt.AsEnumerable().Where(x => x < 10).AsEnumerable().CopyToDataTable().AsDataView();

并在两个 AsEnumerable() 之间执行我想要的任何查询。 如果您不需要查询空间,您可以直接这样做:

grid1.DataContext = dt.AsDataView();

【讨论】:

以上是关于如何将 DataTable 绑定到 Datagrid的主要内容,如果未能解决你的问题,请参考以下文章

如何将 DataTable 绑定到 Datagrid

如何将 DataTable.Select() 的结果绑定到 ListBox 控件?

如何将每行具有不同组合框项的 DataTable 绑定到 DataGridView?

TextBox 绑定到DataTable某一列属性上

将 DataGrid 绑定到两个 DataTable

将行号列添加到绑定到 DataTable 的 DataGridView