mo.notono.us

Thursday, November 04, 2004

'There was an error committing the row back to the data source. Index was out of range'

Do you wish to correct the value?

Another "feature" of the Windows Forms DataGrid that drove me nuts for some time yesterday. Roughly speaking my problem and solution is described here: RE: [aus-dotnet] DataGrid.CurrentRowIndex vs DataGrid.CurrentCell.RowNumber

My problem also seemed to have been caused by setting the DataSource to Nothing/null, which I had done to force a refresh of the grid. As a reminder to myself, this is a better way to refresh the grid:

CType(Me.BindingContext(myGrid.DataSource), CurrencyManager).Refresh()

Also, supposedly one should use the SetDataBinding method rather than setting the DataSource at runtime. I find that strange, as the DataSource property's set statement does almost exactly the same thing as the SetDataBinding method does:

Public Sub set_DataSource(ByVal value As Object)
      If (((Not value Is Nothing) AndAlso Not TypeOf value Is IList) AndAlso Not TypeOf value Is IListSource) Then
            Throw New Exception(SR.GetString("BadDataSourceForComplexBinding"))
      End If
      If ((Me.dataSource Is Nothing) OrElse Not Me.dataSource.Equals(value)) Then
            If (((value Is Nothing) OrElse (value Is Convert.DBNull)) AndAlso Not "".Equals(Me.DataMember)) Then
                  Me.dataSource = Nothing
                  Me.DataMember = ""
            Else
                  Dim flag1 As Boolean
                  If (Not value Is Nothing) Then
                        Me.EnforceValidDataMember(value)
                  End If
                  Me.parentRows.Clear
                  Me.originalState = Nothing
                  Me.caption.BackButtonVisible = (flag1 = False)
                  Me.caption.DownButtonActive = (flag1 = flag1)
                  Me.caption.BackButtonActive = flag1
                  Me.caption.SetDownButtonDirection(Not Me.layout.ParentRowsVisible)
                  Me.Set_ListManager(value, Me.DataMember, False)
            End If
      End If
End Sub
vs.
Public Sub SetDataBinding(ByVal dataSource As Object, ByVal dataMember As String)
      Dim flag1 As Boolean
      Me.parentRows.Clear
      Me.originalState = Nothing
      Me.caption.BackButtonVisible = (flag1 = False)
      Me.caption.DownButtonActive = (flag1 = flag1)
      Me.caption.BackButtonActive = flag1
      Me.caption.SetDownButtonDirection(Not Me.layout.ParentRowsVisible)
      Me.Set_ListManager(dataSource, dataMember, False)
End Sub

Labels:

0 Comments:

Post a Comment

<< Home