数据绑定与赋值
如果一个控件已经绑定到了某列,就不应该直接设置该控件的值,而是直接设置其绑定列的值。
假定有一个日期输入框(DateTimePicker),绑定到了订单表的日期列,我们将某个按钮的代码设置为:
Dim
dtp As WinForm.DateTimePicker = e.Form.Controls("DateTimePicker1")
单击这个按钮,你会发现日期输入框的值,确实等于今天的日期,但是订单表日期列的值,并不是今天,而是原来的值。
也就是说,在绑定状态下,设置控件的值,并不会同步更新其绑定列的值。
在绑定状态下,我们应该直接设置列的值,而不是控件的值。
例如我们将按钮的代码改为:
Tables(
"订单").Current("日期") = Date.Today()现在单击这个按钮,可以发现日期输入框的值和订单表的日期列,都等于今天的日期。
实际上,在绑定状态下,不管是写值还是取值,都应该通过列进行,而不是通过控件进行。
例如假定窗口有个TextBox控件,绑定到表A的第一列,在窗口的AfterLoad设置如下代码:
Dim
txt1 As
WinForm.TextBox
= e.Form.Controls("TextBox1")
MessageBox.Show(txt1.Value)
然后打开窗口,可以发现显示的是一个空值,而不是第一列真正的值,因为窗口刚刚打开的时候,控件还没有来得及从表中取值。
在绑定状态下取值,一样应该直接读取列的值,而不是读取控件的值,所以正确的代码是:
Dim
txt1 As
WinForm.TextBox
= e.Form.Controls("TextBox1")
MessageBox.Show(Tables("表A").Current("第一列")
使用控件事件还是使用表事件?
同样如果控件已经绑定到某列,那么尽量不要再使用该控件的ValueChanged和TextChanged事件,而应该使用表事件DataColChanging和DataColChanged,因为控件的ValueChanged和TextChanged事件触发的时候,刚刚输入的内容还没有写入到表中,此时通过事件修改当前行任何一列的值,都会导致控件从表中读取数据刷新显示,导致刚刚输入的内容丢失。如果一定要使用这两个事件,为避免丢失输入的内容,可以 在事件代码的开始位置加上:
e.Sender.WriteValue()
此代码会将已经输入的内容提前写入表中。