【发布时间】:2021-01-19 22:07:57
【问题描述】:
我想在 Windows 窗体和 VB 中使用 BindingSource 从 SQL Server 插入数据库。
现在我有一个 DataTable,它的 DataTableAdapter 处于“详细信息”模式,还有一堆 TextBox(和其他控件,但这不是问题),它们的 Text 属性绑定到我的 BindingSource。
如果我填充 TableAdapter XDataTableAdapter.Fill(XDataSet.XTable) 那些 TextBoxs 从第一个条目接收数据,并且 BindingSource 具有来自 db 的每一行和每个列值,因此 BindingSource 和适配器工作。
我不想修改现有条目,而是插入一个新条目,其内容与各种文本框中链接的内容相同。
我被告知我应该使用XBindingSource.AddNew(),最后,一旦我确定了文本框中的数据XDataTableAdapter.Update(XDataSet.XTable)。
问题是,在我执行 AddNew 之前,我的 BindingSource 可以读取正在写入的内容。但是一旦我到达 AddNew,BindingSource 的计数就会增加 1,但其当前行的 Items 是空的,无论 TextBox 的内容如何。
所以问题是,在 BindingSource.AddNew 之后,来自 db 的行正确包含其值,但当前的新行将它们设为空,而无需从文本框的 bindingsources 中读取。是否有任何指令要 BindingSource 执行以便它知道新行应该读取文本框?
所以当我到达更新指令时,新行是空的,所以它不会改变任何东西。
我的问题是,我如何告诉 BindingSource 新的当前行是文本框中正在写入的内容。
我只是想直接从控件绑定中插入我的数据库,而不必手动链接每一个。
【问题讨论】:
-
不确定您所描述的场景,但您是否曾致电
[BindingSource].EndEdit()?或Validate(). -
我没有调用 EndEdit() 因为我不打算编辑用户编写的内容,并且在允许单击按钮之前通过正则表达式执行验证,所以我不使用 Validate( ) 都没有
-
您应该在输入新数据之前致电
AddNew。如果TextBoxes绑定到BindingSource,那么调用AddNew应该创建一个新的DataRow,其中RowState是Detached,并且该行应该是您在控制中看到的。然后用户将数据输入该行。您可以通过这种方式添加和编辑任意数量的行。当需要保存时,您在表单上调用Validate,在BindingSource上调用EndEdit,以确保最后一个挂起的编辑已推送到数据源,然后在适配器上调用Update。 -
请注意,如果您在调用
AddNew之后在BindingSource上调用CancelEdit,则DetachedDataRow将被丢弃,而不会实际添加到DataTable。AddNew将在DataTable上调用NewRow,EndEdit将调用Rows.Add。
标签: sql-server vb.net winforms bindingsource