2014-09-26 63 views
0

我有一个DataTable,我绑定到WPF中的DataGrid。在XAML中没有生成列,当我在代码中创建DataTable时,所有事情都完成了。直接绑定到DataTable时验证DataGrid数据 - C#/ WPF

我有2路绑定,所以用户可以更新DataGrid中的值,它将更新DataTable,虽然这不是我调试时可以看到的事件,但我的结果显示它按预期工作。

但是,如果列的类型是double,并且用户输入文本,则该单元格的现有DataTable数据将被保留,单元格将以红色标出,而我的调试器输出会显示FormatException发生。

我所想要做的是能够之一:

一)处理这个异常,并显示一个警告用户在我UI

二)有一定可设置自定义的验证方法在我的代码标志,我可以用来处理在某些时候的错误

我不介意我去哪个解决方案,我只是不希望用户不会注意到错误。

谢谢。

回答

0

如果你想留在ado.net和数据表,然后:http://msdn.microsoft.com/en-us/library/1120xds5.aspx

编辑:

this.MyTable.ColumnChanging += MyTableColumnChangingStuff; 

    private void MyTableColumnChangingStuff(object sender, DataColumnChangeEventArgs e) 
    { 
     if(e.Column.ColumnName == "MyColumnTestName") 
     { 
      var errormsg = MyValidateTestNameMethod(e.ProposedValue); 
      e.Row.SetColumnError(e.Column.ColumnName, errormsg); 
     } 
     //... 
    } 

编辑2:

谢谢,只是给一个尝试,而事件当我修改正确类型的数据时,它会被调用,如果用户输入的数据类型 错误,它不会被调用。与之前相同,框 以红色突出显示,格式异常由wpf处理,但不调用 事件。

那是真的。对我来说只有2个解决方案。首先为您的输入控件创建行为,您可以确保这些值始终可以转换为您的基础类型。另一种解决方案就是你的viewmodel绑定到的只是string类型的属性。这样做的好处是 - 你从来没有因为投射类型而获得绑定感染。你现在要做的是在你检查你的字符串属性的地方实现IDataErrorInfo。当你去你的模型时,你必须将你的字符串值转换为正确的类型。

直到现在我使用第一种方法,因为我使用datepicker,数字行为并没有任何其他类型。

+0

感谢您的回复,我无法遵循,因为我没有任何数据集可以在数据集设计器中打开。我在我需要的类的实例中创建并填充绑定的数据表。 – 2014-10-01 13:15:41

+0

你不需要设计师。你简单的使用DataTable.ColumnChanging事件。在那里你可以用SetColumnError设置你的验证规则。请参阅我的编辑 – blindmeis 2014-10-01 13:30:27

+0

谢谢,只是在尝试修改正确类型的数据时调用该事件时,如果用户输入的数据类型错误,则不会调用它。与之前一样,该框突出显示为红色,格式异常由wpf处理,但事件未被调用。 – 2014-10-01 13:50:58