如何将 DataTable 绑定到 Datagrid?

35

我遇到了一个问题,无法将 DataTable 绑定到 DataGrid。我已经搜索了各种解决方案,但仍无法消除错误。使用 WindowsForms 时,绑定正常,因此 DataTable 是正确的。 我只是无法将其绑定到 WPF-DataGrid。

错误信息: AmbiguousMatchException was unhandled
Source: mscorlib

我已经建立了一个新项目,以排除任何坏链接等问题。

XAML 代码:

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

我已经尝试过以下 C# 代码:

grid1.ItemsSource = dt.DefaultView;
或者
grid1.DataContext = dt.DefaultView;
或者
grid1.DataContext = dtex;

感激任何帮助。


2
展示你的 DataTable 结构。同时,如果你是从代码后台进行设置,那么就不需要在 xaml 中设置 ItemsSource - Rohit Vats
DataTable是通过SQLDataAdapter填充的。由于我使用表格的值进行计算,因此表格被填充。导出方法也运行良好。只是与WPFDataGrid的绑定有问题。 - Cygu
7个回答

67

在 cs 文件中

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

在 xaml 文件中

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

1
这似乎在 WPF 中对我起作用 - 问题是,为什么 Visual Studio 在这种情况下不会自动调整 XAML 呢? - jordan

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

您能否详细阐述一下您的答案,并对您提供的解决方案进行更多描述? - abarisone
通过添加 dataGrid1.AutoGenerateColumns=true; 我们将在 datagrid 上获得输出,否则它将不会显示输出。 - user5340894
1
AutoGenerateColumns的默认值为true,因此那行代码实际上并不需要。 - Daniel Wu

11

在 .cs 文件中

grid.DataContext = table.DefaultView;

在 XAML 文件中

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

4
您可以在 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;

1
第一句话说:“我在将一个 DataTable 绑定到 DataGrid 时遇到了问题。” 从 OP 的问题中可以看出他确实使用了 DataGrid,那这句话的意义是什么呢? - Hille
我的DataGrid没有ItemsSource,但有DataContext。我该怎么办? - MindRoasterMir

1

正如Rohit Vats在他的评论中提到的那样,我预计您的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<string[]>)转换为 DataTable,如上面的代码所示,并将此 DataTable 传递给 DataGrid。通过指定数据列,数据网格可以生成所需的列并将其可视化。

简而言之,在我的情况下,绑定到 DataTable 的工作非常顺利。


除非有人提出更优雅的(语法糖,有人吗?)将可扩展对象绑定到PODG(普通数据网格)的方法,否则我将使用数据表方法。易于设置,易于数据绑定。 - code4life
据我所了解,在.NET 4.0中,没有更优雅的解决方案来将可缩放列的DataTable绑定到DataGrid。网络上有足够的示例来绑定固定列表格。也许微软会在以后的版本中提供一种方法。 - Marschal

0
我会这样做:
grid1.DataContext = dt.AsEnumerable().Where(x => x < 10).AsEnumerable().CopyToDataTable().AsDataView();

在两个AsEnumerable()之间,您可以执行任何查询操作。 如果您不需要查询空间,您可以直接执行以下操作:

grid1.DataContext = dt.AsDataView();

-2

在 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}" />

1
这相当于OP在问题中发布的内容。问题出在他绑定到的DataTable中的某个地方。 - Rohit Vats
我有一个在另一个类中的方法,它返回一个数据表。table1 = myClassInstance.myMethod(); MessageBox 显示 table1 有4列和几行数据。然后我想将 table1 绑定到 WPF 中的 DataGrid。 - Cygu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接