数据绑定与赋值

如果一个控件已经绑定到了某列,就不应该直接设置该控件的值,而是直接设置其绑定列的值。

假定有一个日期输入框(DateTimePicker),绑定到了订单表的日期列,我们将某个按钮的代码设置为:

Dim dtp As WinForm.DateTimePicker = e.Form.Controls("DateTimePicker1")
dtp.Value =
Date.Today
MessageBox.Show(
"输入框的值:" & dtp.Value)
MessageBox.Show(
"日期列的值:" & Tables("订单").Current("日期"))

单击这个按钮,你会发现日期输入框的值,确实等于今天的日期,但是订单表日期列的值,并不是今天,而是原来的值。
也就是说,在绑定状态下,设置控件的值,并不会同步更新其绑定列的值。

在绑定状态下,我们应该直接设置列的值,而不是控件的值。
例如我们将按钮的代码改为:

Tables("订单").Current("日期") = Date.Today()
MessageBox.Show(
"输入框的值:" & e.Form.Controls("DateTimePicker1").Value)
MessageBox
.Show("日期列的值:" & Tables("订单").Current("日期"
))

现在单击这个按钮,可以发现日期输入框的值和订单表的日期列,都等于今天的日期。

实际上,在绑定状态下,不管是写值还是取值,都应该通过列进行,而不是通过控件进行。

例如假定窗口有个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()

此代码会将已经输入的内容提前写入表中。


本页地址:http://www.foxtable.com/webhelp/topics/2436.htm