Vb.net 无法保存已绑定的文本框ฺ;但如果使用与DatagrDiView相同的绑定,则可以节省

Vb.net 无法保存已绑定的文本框ฺ;但如果使用与DatagrDiView相同的绑定,则可以节省,vb.net,datagridview,textbox,bindingsource,Vb.net,Datagridview,Textbox,Bindingsource,我需要显示列表和详细信息等信息。 因此,我为Datagridview(列表)和textbox(详细信息)创建了一个bindingSource 绑定似乎很成功。若我在datagridview中更改所选的行,一行之后的文本框将更改。我尝试在datagridview中编辑值,然后保存它。它可以节省。 但如果尝试通过文本框更改值。值没有任何更改 Private ds As DatasetHTN Private bs As BindingSource Private ta As HTN_TEMP_ORDE

我需要显示列表和详细信息等信息。 因此,我为Datagridview(列表)和textbox(详细信息)创建了一个bindingSource

绑定似乎很成功。若我在datagridview中更改所选的行,一行之后的文本框将更改。我尝试在datagridview中编辑值,然后保存它。它可以节省。 但如果尝试通过文本框更改值。值没有任何更改

Private ds As DatasetHTN
Private bs As BindingSource
Private ta As HTN_TEMP_ORDER_FILETableAdapter

ds = New DatasetHTN()
Me.bs = New BindingSource(Me.ds, Me.ds.HTN_TEMP_ORDER_FILE.TableName)
Me.DataGridView1.DataSource = Me.bs
Me.TextBox1.DataBindings.Add("Text", Me.bs, "REVISION_NO", True)

Me.ta.Fill(Me.ds.HTN_TEMP_ORDER_FILE)
我试图通过使用这些代码来保存

Me.ta.Update(Me.ds.HTN_TEMP_ORDER_FILE)
如果我编辑datagridview的某一行,它可以保存。但如果我通过文本框编辑,则无法保存。 我需要知道数据行是否有更改?所以我在文本框中编辑一个值后,调用此代码进行检查更改

    Me.ds.AcceptChanges()
    Dim dsChange As DataSet = Me.ds.GetChanges()
    Dim dtChanged As DataTable = dsChange.Tables(0)
    If dtChanged IsNot Nothing AndAlso dtChanged.Rows.Count > 0 Then
        Dim dr As DataRow = dtChanged.Rows(0)
        For Each dc As DataColumn In dtChanged.Columns
            Dim strOrg As String = String.Empty
            Dim strNew As String = String.Empty
            If Not IsDBNull(dr(dc.ColumnName, DataRowVersion.Original)) Then
                strOrg = dr(dc.ColumnName, DataRowVersion.Original)
            End If
            If Not IsDBNull(dr(dc.ColumnName, DataRowVersion.Current)) Then
                strNew = dr(dc.ColumnName, DataRowVersion.Current)
            End If
            If strOrg <> strNew Then
                ShowMessage(strNew)
            End If
        Next
    End If
Me.ds.AcceptChanges()
Dim dsChange As DataSet=Me.ds.GetChanges()
Dim DTCHANGE为DataTable=dsChange.Tables(0)
如果dtChanged不是Nothing,并且dtChanged.Rows.Count>0,则
Dim dr As DataRow=dtChanged.Rows(0)
对于dtChanged.Columns中的每个dc As数据列
Dim strOrg As String=String.Empty
Dim strNew As String=String.Empty
如果不是IsDBNull(dr(dc.ColumnName,DataRowVersion.Original)),则
strOrg=dr(dc.ColumnName,DataRowVersion.Original)
如果结束
如果不是IsDBNull(dr(dc.ColumnName,DataRowVersion.Current)),则
strNew=dr(dc.ColumnName,DataRowVersion.Current)
如果结束
如果strOrg strNew那么
ShowMessage(strNew)
如果结束
下一个
如果结束

但是我发现GetChanges()返回“nothing”。这意味着文本框不会改变。为什么?

在您看来,
Me.ds.AcceptChanges()
在做什么?你试过移除它吗?如果文本框绑定到同一数据源,那么在验证文本(更改已确认)时,您不能在DataGridView中看到值更改吗?请注意:
Me.TextBox1.DataBindings.Add(“text”,Me.bs,“REVISION_NO”,True)
DataSourceUpdateMode=OnValidation
中添加绑定,不是
OnPropertyChanged
。我知道您添加了
.AcceptChanges()
,问题是您是否知道这会起什么作用。好吧,就是不要这么做。首次填充数据表时调用
.AccepChange()
(或者,使用DataAdapter,在Me.ds.AcceptChanges()之后将
AcceptChangesDuringUpdate
AcceptChangesDuringFill
设置为
true
Me.ds.GetChanges()将始终不返回任何内容,因此您的其余代码永远不会运行。正如@Jimi所说,删除对AcceptChanges()的调用。在尝试保存之前,您还应该在表单上调用
Validate
,并在
BindingSource
上调用
EndEdit
,以便将任何挂起的编辑提交到
数据表中。