如何将 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<string[]>
)转换为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.Select() 的结果绑定到 ListBox 控件?