更改DataTable行值后更新DataGrid

时间:2018-06-20 17:31:03

标签: c# wpf data-binding datatable wpfdatagrid

我有一个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();

但是那没有效果。我是否在这里丢失了某些东西,还是需要更改将数据绑定到网格的方式。谢谢。

1 个答案:

答案 0 :(得分:1)

我不认为DataRow实现通知。不要将Rows集合用作ItemsSource(m_grid.ItemsSource = l_table.Rows;),而要使用DefaultView:

 m_grid.ItemsSource = l_table.DefaultView;

它还将正确自动生成DataGrid中的列。而且DataView支持排序和过滤。

但是请注意,在进行此类更改之后,DataGrid将包含类型为DataRowView(具有Row属性)的项。使用SelectedItem的代码也应修改