如何更改任何DataRow元素时通知?

时间:2018-03-14 15:23:21

标签: c# datatable

目前系统的设置方式,我在SelectedRow更改时执行PropertChanged事件

PropertyChanged += Table_PropertyChanged;

private void Table_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    // If the Selected row changes..
    if (e.PropertyName == nameof(SelectedRow))
    {
     //some code here 
    }
}

问题在于,如果它是表格中的底行,则没有任何更新,因为没有选择新行。我想检查一下该行的任何单个元素是否发生变化。

目前,用户与DataView进行交互,DataView绑定到表格' tbl'在幕后。 DataView被称为' dv'。

当用户编辑其中一行中的字段时,我发现正确触发事件的唯一方法如下:

public TableViewModel()
{
    PropertyChanged += Table_PropertyChanged;
    // Prepare the Dummy DataTable, put it in the main Tbl DataTable
    ValsToDummy();

    Tbl = Dummy;

    Tbl.TableName = "Dummy";
    dv.Table = Tbl;

    dv.ListChanged += new System.ComponentModel.ListChangedEventHandler(OnListChanged);
}

protected void OnListChanged(object sender, System.ComponentModel.ListChangedEventArgs args)
{
    if (args.ListChangedType.ToString() == "ItemChanged")
    {
    Console.WriteLine("ListChanged:");
    Console.WriteLine("\t    Type = " + args.ListChangedType);
    Console.WriteLine("\tOldIndex = " + args.OldIndex);
    Console.WriteLine("\tNewIndex = " + args.NewIndex);
    Console.out.writeline("change");
    updateTable();
    }
}

这个问题是它太容易引发并且经常导致堆栈溢出。 UpdateTable调用查询来更新我的数据库。控制台输出看起来像这样......重复多次直到崩溃

ListChanged:
        Type = ItemChanged
    OldIndex = -1
    NewIndex = 9
ListChanged:
        Type = ItemChanged
    OldIndex = -1
    NewIndex = 9
ListChanged:
        Type = ItemChanged
    OldIndex = -1
    NewIndex = 9
ListChanged:
        Type = ItemChanged
    OldIndex = -1
    NewIndex = 9
ListChanged:
        Type = ItemChanged
    OldIndex = -1
    NewIndex = 9

我目前的解决方法是

 if (args.ListChangedType.ToString() == "ItemChanged" && args.OldIndex == args.NewIndex)

1 个答案:

答案 0 :(得分:0)

基本上这会像你的其他事件一样工作,你需要为数据表的ColumnChanged事件创建一个事件处理程序,并编写一个处理变化的方法。

    DataTable yourTable = new DataTable();

    //This is the important step
    // add a ColumnChanged event handler for the table.
    yourTable.ColumnChanged += new 
        DataColumnChangeEventHandler(Column_Changed );

另见
MSDN Documentation