0

我对使用 BindingSources 和 DataNavigators(以及 VB .NET)进行编程有点陌生,所以这是我的问题/问题。

我正在用 VB 2010 编写一个应用程序,用户将在其中更新后端 SQL 2008 R2 服务器中的数据。设计模式下的表单在表单底部有一个 BindingSource、DataSet 以及用于数据和复选框的各种文本框和一个 DataNavigator。

当表单加载时,会加载 DataAdapter,然后加载数据集。(省略连接代码,“text_table”是SQL server中的一个测试表。

frmDataAdapter = New SqlClient.SqlDataAdapter(SQL_Query, frmConnection)
frmConnection.Open()
frmDataAdapter.FillSchema(frmDataSet, SchemaType.Source, "test_table")
frmDataAdapter.Fill(frmDataSet, "test_table")

我将 BindingSource 绑定到 DataSet 和 DataNavigator ...

With frmBindingSource
   .DataMember = "test_table"
   .DataSource = frmDataSet
End With
frmBindingNavigator.BindingSource = frmBindingSource

我将文本框和复选框绑定到 BindingSource ...

With Me
    .Date_Logged.DataBindings.Add("Text",frmBindingSource, "DateLogged", True, DataSourceUpdateMode.OnValidation, vbNullString, "MM/dd/yyyy")
    .Prepared_By.DataBindings.Add("Text", frmBindingSource, "PreparedBy", False, DataSourceUpdateMode.OnValidation, vbNullString)
    .Issue_Placement.DataBindings.Add("Text", frmBindingSource, "IssuePlacement", False, DataSourceUpdateMode.OnValidation, vbNullString)
    .Completed.DataBindings.Add("Checked", frmBindingSource, "Completed", False, DataSourceUpdateMode.OnValidation, False)
End With

问题是,虽然“已完成”复选框绑定到“frmBindingSource”,但如果我按下 BindingNavigator 上的添加记录按钮,所有其他控件(文本框)都不会清除,因此用户可以输入新数据,但是随着 DataNavigator 中的计数增加,确实会创建一条新记录。(那时我通常会阻止程序实际将任何内容保存到表中。)

如果我删除“已完成”复选框的绑定,然后再试一次,当我按下添加记录按钮时,其他文本框会按应有的方式清除。将“已完成”复选框绑定放回原处,它就会停止工作。

SQL 服务器中的“已完成”字段是“位”,默认值为“0”,因此所有数据都有有效条目,“已完成”字段中没有任何内容为 NULL。我试过以各种方式绑定“已完成”复选框,但总是遇到同样的问题。

目前没有验证代码或任何其他真实事件,因为这是在项目开始时,但这有点烦人,因为我需要使用复选框。

有人知道我在这里做错了什么吗?

4

1 回答 1

0

在整个周末都在研究这个之后,我有了解决方案。

我在测试期间能够确定的是,如果您使用带有 BindingNavigator 的复选框的表单,BindingNavigator 想要查看复选框的“CheckState”,而不仅仅是“Check”状态。

这里的问题是,如果您绑定到“CheckState”并且您的字段是布尔值,您将收到一个错误,因此您必须将格式标志翻转为“True”并将“nullValue”设置为“CheckState.Unchecked”。

所以我的复选框绑定现在..

Me.Completed.DataBindings.Add("CheckState", frmBindingSource, "Completed", True, DataSourceUpdateMode.OnValidation, CheckState.Unchecked)

使用上述解决问题。

于 2013-01-07T13:27:18.707 回答