我有一个DataGrid(名为m_grid)设置,以便显示DataTable的行:
<DataGrid name="m_grid">
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="Locked"
Binding="{Binding '[Locked]'}"/>
...
</DataGrid.Columns>
</DataGrid>
我像这样在后面的代码中填充网格:
DataTable l_table = Database.GetTable("SELECT * FROM Reports")
m_grid.ItemsSource = l_table.Rows;
我有一个上下文菜单,该菜单在click事件上附加了以下方法:
DataRow l_row = m_grid.SelectedItem as DataRow;
int l_id = (int)l_row["Report ID"];
int l_result = Database.Execute("Update [Reports] SET [Locked] = not [Locked] WHERE [Report ID]=" + l_id;
if (l_result > 0){
l_row["Locked"] = !l_row["Locked"];
}
单击运行后,将更新数据库,并且该行中的值已更改,但是DataGrid保持不变。我尝试使用
m_grid.BeginEdit();
// execute code
m_grid.CommitEdit();
但是那没有效果。我是否在这里丢失了某些东西,还是需要更改将数据绑定到网格的方式。谢谢。
答案 0 :(得分:1)
我不认为DataRow实现通知。不要将Rows集合用作ItemsSource(m_grid.ItemsSource = l_table.Rows;
),而要使用DefaultView:
m_grid.ItemsSource = l_table.DefaultView;
它还将正确自动生成DataGrid中的列。而且DataView支持排序和过滤。
但是请注意,在进行此类更改之后,DataGrid将包含类型为DataRowView
(具有Row
属性)的项。使用SelectedItem的代码也应修改