Home All Groups Group Topic Archive Search About

error when adding column to datatable: There is no row at position

Author
1 Nov 2006 11:30 PM
svbridget
Since upgrading to the 2.0 framework I am getting an error that was not
present in 1.1.  I have a grid that is bound to a DataView, which was
initialized with a DataTable.  I set up the initial rows & cols in the
DataTable, create the DataView, and bind the grid to it.  After that, I try
to add a column to DataTable.Columns, and I get this error:

"There is no row at position 0."

   at System.Data.DataView?.GetRecord?(Int32 recordIndex)
   at System.Data.DataView?.GetRow?(Int32 index)
   at System.Data.DataView?.UpdateDataRowViewCache?()
   at System.Data.DataView?.OnListChanged?(ListChangedEventArgs? e)
   at System.Data.DataView?.ColumnCollectionChanged?(Object sender,
CollectionChangeEventArgs? e)
   at System.Data.DataViewListener?.ColumnCollectionChanged?(Object sender,
CollectionChangeEventArgs? e)
   at
System.Data.DataColumnCollection?.OnCollectionChanged?(CollectionChangeEventArgs? ccevent)
   at System.Data.DataColumnCollection?.AddAt?(Int32 index, DataColumn?
column)
   at System.Data.DataColumnCollection?.Add(DataColumn? column)

I can't fathom why the code for adding a column is trying to update the
_row_ cache of the DataView.  Also it doesn't seem to matter that there
actually is a row at position 0...

As a workaround I am setting the DataView's DataTable to Nothing, adding the
column, then setting the DataView's DataTable back to the DataTable.

But if someone could explain why this is happening in 2.0 I would appreciate
it.

Thanks.

Author
2 Nov 2006 5:13 AM
Cor Ligthert [MVP]
SVBridget,

Probably there is something wrong in your code, but that we cannot see.
Mostly it helps if we can see that as well, because you cannot find the
reason even with that code.

Therefore maybe it will help if you show the relevant parts of that

Cor

Show quote
"svbridget" <svbrid***@discussions.microsoft.com> schreef in bericht
news:2EB523E0-5D2F-4A76-89E2-C42DE7C463BA@microsoft.com...
> Since upgrading to the 2.0 framework I am getting an error that was not
> present in 1.1.  I have a grid that is bound to a DataView, which was
> initialized with a DataTable.  I set up the initial rows & cols in the
> DataTable, create the DataView, and bind the grid to it.  After that, I
> try
> to add a column to DataTable.Columns, and I get this error:
>
> "There is no row at position 0."
>
>   at System.Data.DataView?.GetRecord?(Int32 recordIndex)
>   at System.Data.DataView?.GetRow?(Int32 index)
>   at System.Data.DataView?.UpdateDataRowViewCache?()
>   at System.Data.DataView?.OnListChanged?(ListChangedEventArgs? e)
>   at System.Data.DataView?.ColumnCollectionChanged?(Object sender,
> CollectionChangeEventArgs? e)
>   at System.Data.DataViewListener?.ColumnCollectionChanged?(Object sender,
> CollectionChangeEventArgs? e)
>   at
> System.Data.DataColumnCollection?.OnCollectionChanged?(CollectionChangeEventArgs?
> ccevent)
>   at System.Data.DataColumnCollection?.AddAt?(Int32 index, DataColumn?
> column)
>   at System.Data.DataColumnCollection?.Add(DataColumn? column)
>
> I can't fathom why the code for adding a column is trying to update the
> _row_ cache of the DataView.  Also it doesn't seem to matter that there
> actually is a row at position 0...
>
> As a workaround I am setting the DataView's DataTable to Nothing, adding
> the
> column, then setting the DataView's DataTable back to the DataTable.
>
> But if someone could explain why this is happening in 2.0 I would
> appreciate
> it.
>
> Thanks.
>
>
Author
2 Nov 2006 5:22 PM
svbridget
Sure, here's the repro code.  Also as I noted previously this did not throw
an error in 1.1.

I am including the form code and the designer code below. Click Setup, then
click Error, and the error will appear.

I currently have two workarounds: a) set the dataview's datasource to
nothing, add the column, then set it back to datatable b) take out
beginloaddata and endloaddata.

-B

-------------------- BEGIN FORM CODE ------------------------
Imports System.Data

Public Class Form1

    Private Sub cmdSetup_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdSetup.Click
        Dim table As DataTable = New DataTable("Flowchart")

        Dim myDataColumn As DataColumn
        myDataColumn = New DataColumn
        myDataColumn.DataType = GetType(System.String)
        myDataColumn.ColumnName = "Flowchart"
        myDataColumn.AutoIncrement = False
        myDataColumn.Caption = "Flowchart"
        myDataColumn.Unique = False
        table.Columns.Add(myDataColumn)

        ' Hidden column for object type
        myDataColumn = New DataColumn
        myDataColumn.DataType = GetType(System.Double)
        myDataColumn.ColumnName = "ObjectType"
        myDataColumn.AutoIncrement = False
        myDataColumn.Caption = "ObjectType"
        myDataColumn.Unique = False
        table.Columns.Add(myDataColumn)

        ' hidden column for sort string
        myDataColumn = New DataColumn
        myDataColumn.DataType = GetType(System.String)
        myDataColumn.ColumnName = "Sort"
        myDataColumn.AutoIncrement = False
        myDataColumn.Caption = "Sort"
        myDataColumn.Unique = False
        table.Columns.Add(myDataColumn)

        Dim dataview As New DataView(table)
        dataview.Sort = "ObjectType, Sort"
        grdFlowChartOrig.DataSource = dataview

        AddFlowChartRow(2, "A")
        AddFlowChartRow(3, "B")
        AddFlowChartRow(1, "C")
        AddFlowChartRow(4, "D")

        AddFlowChartColumn(table)
        AddFlowChartColumn(table)
        AddFlowChartColumn(table)

        AddFlowChartRow(2, "A")
        AddFlowChartRow(3, "B")
        AddFlowChartRow(1, "C")
        AddFlowChartRow(4, "D")

        grdFlowChartOrig.Refresh()

    End Sub


    Private Sub cmdError_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdError.Click
        Dim objTable As DataTable = DirectCast(grdFlowChartOrig.DataSource,
DataView).Table
        Dim objView As DataView = DirectCast(grdFlowChartOrig.DataSource,
DataView)

        objTable.Rows.Clear()
        objTable.BeginLoadData()
        While objTable.Columns.Count > 3
            objTable.Columns.RemoveAt(objTable.Columns.Count - 1)
        End While

        AddFlowChartRow(3, "E")
        AddFlowChartRow(1, "E")
        AddFlowChartRow(2, "E")

        AddFlowChartColumn(objTable)
        objTable.EndLoadData()
        objTable.AcceptChanges()
    End Sub


    Public Sub AddFlowChartRow(ByVal nObjectType As Double, Optional ByVal
strSort As String = "")
        Static i As Integer = 0

        Dim objTable As DataTable = DirectCast(grdFlowChartOrig.DataSource,
DataView).Table
        Dim objRow As DataRow = objTable.NewRow()
        objRow(0) = "row" & CStr(i)
        objRow(1) = nObjectType
        objRow(2) = strSort
        objTable.Rows.Add(objRow)
        i = i + 1
    End Sub

    Public Sub AddFlowChartColumn(ByVal objTable As DataTable)
        Static i As Integer = 0

        Dim myDataColumn As New DataColumn
        myDataColumn.DataType = GetType(System.String)
        myDataColumn.ColumnName = "new column" & CStr(i)
        myDataColumn.AutoIncrement = False
        myDataColumn.Caption = "new column" & CStr(i)
        myDataColumn.Unique = False
        objTable.Columns.Add(myDataColumn) ' ERROR THROWN HERE

        i = i + 1
    End Sub


End Class

-------------------- END FORM CODE ---------------------------



-------------------- BEGIN DESIGNER CODE --------------------
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
    Inherits System.Windows.Forms.Form

    'Form overrides dispose to clean up the component list.
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer. 
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.grdFlowChartOrig = New System.Windows.Forms.DataGridView
        Me.cmdSetup = New System.Windows.Forms.Button
        Me.cmdError = New System.Windows.Forms.Button
        CType(Me.grdFlowChartOrig,
System.ComponentModel.ISupportInitialize).BeginInit()
        Me.SuspendLayout()
        '
        'grdFlowChartOrig
        '
        Me.grdFlowChartOrig.ColumnHeadersHeightSizeMode =
System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
        Me.grdFlowChartOrig.Location = New System.Drawing.Point(12, 35)
        Me.grdFlowChartOrig.Name = "grdFlowChartOrig"
        Me.grdFlowChartOrig.Size = New System.Drawing.Size(423, 169)
        Me.grdFlowChartOrig.TabIndex = 0
        '
        'cmdSetup
        '
        Me.cmdSetup.Location = New System.Drawing.Point(454, 49)
        Me.cmdSetup.Name = "cmdSetup"
        Me.cmdSetup.Size = New System.Drawing.Size(100, 58)
        Me.cmdSetup.TabIndex = 1
        Me.cmdSetup.Text = "Setup"
        Me.cmdSetup.UseVisualStyleBackColor = True
        '
        'cmdError
        '
        Me.cmdError.Location = New System.Drawing.Point(457, 129)
        Me.cmdError.Name = "cmdError"
        Me.cmdError.Size = New System.Drawing.Size(97, 58)
        Me.cmdError.TabIndex = 2
        Me.cmdError.Text = "Trigger Error"
        Me.cmdError.UseVisualStyleBackColor = True
        '
        'Form1
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(580, 253)
        Me.Controls.Add(Me.cmdError)
        Me.Controls.Add(Me.cmdSetup)
        Me.Controls.Add(Me.grdFlowChartOrig)
        Me.Name = "Form1"
        Me.Text = "Form1"
        CType(Me.grdFlowChartOrig,
System.ComponentModel.ISupportInitialize).EndInit()
        Me.ResumeLayout(False)

    End Sub
    Friend WithEvents grdFlowChartOrig As System.Windows.Forms.DataGridView
    Friend WithEvents cmdSetup As System.Windows.Forms.Button
    Friend WithEvents cmdError As System.Windows.Forms.Button

End Class
------------------------- END DESIGNER CODE ---------------------------------


Show quote
"Cor Ligthert [MVP]" wrote:

> SVBridget,
>
> Probably there is something wrong in your code, but that we cannot see.
> Mostly it helps if we can see that as well, because you cannot find the
> reason even with that code.
>
> Therefore maybe it will help if you show the relevant parts of that
>
> Cor
>
> "svbridget" <svbrid***@discussions.microsoft.com> schreef in bericht
> news:2EB523E0-5D2F-4A76-89E2-C42DE7C463BA@microsoft.com...
> > Since upgrading to the 2.0 framework I am getting an error that was not
> > present in 1.1.  I have a grid that is bound to a DataView, which was
> > initialized with a DataTable.  I set up the initial rows & cols in the
> > DataTable, create the DataView, and bind the grid to it.  After that, I
> > try
> > to add a column to DataTable.Columns, and I get this error:
> >
> > "There is no row at position 0."
> >
> >   at System.Data.DataView?.GetRecord?(Int32 recordIndex)
> >   at System.Data.DataView?.GetRow?(Int32 index)
> >   at System.Data.DataView?.UpdateDataRowViewCache?()
> >   at System.Data.DataView?.OnListChanged?(ListChangedEventArgs? e)
> >   at System.Data.DataView?.ColumnCollectionChanged?(Object sender,
> > CollectionChangeEventArgs? e)
> >   at System.Data.DataViewListener?.ColumnCollectionChanged?(Object sender,
> > CollectionChangeEventArgs? e)
> >   at
> > System.Data.DataColumnCollection?.OnCollectionChanged?(CollectionChangeEventArgs?
> > ccevent)
> >   at System.Data.DataColumnCollection?.AddAt?(Int32 index, DataColumn?
> > column)
> >   at System.Data.DataColumnCollection?.Add(DataColumn? column)
> >
> > I can't fathom why the code for adding a column is trying to update the
> > _row_ cache of the DataView.  Also it doesn't seem to matter that there
> > actually is a row at position 0...
> >
> > As a workaround I am setting the DataView's DataTable to Nothing, adding
> > the
> > column, then setting the DataView's DataTable back to the DataTable.
> >
> > But if someone could explain why this is happening in 2.0 I would
> > appreciate
> > it.
> >
> > Thanks.
> >
> >
>
>
>
Author
3 Nov 2006 5:39 AM
Cor Ligthert [MVP]
B,

I tried it and did look even a quiet long while to it, I commit it is
strange, maybe you can drop this code at

http://connect.microsoft.com/Main/content/content.aspx?ContentID=2220

Cor

Show quote
"svbridget" <svbrid***@discussions.microsoft.com> schreef in bericht
news:474BCFB9-4C1B-4EC6-911A-3F05DFFE77C0@microsoft.com...
> Sure, here's the repro code.  Also as I noted previously this did not
> throw
> an error in 1.1.
>
> I am including the form code and the designer code below. Click Setup,
> then
> click Error, and the error will appear.
>
> I currently have two workarounds: a) set the dataview's datasource to
> nothing, add the column, then set it back to datatable b) take out
> beginloaddata and endloaddata.
>
> -B
>
> -------------------- BEGIN FORM CODE ------------------------
> Imports System.Data
>
> Public Class Form1
>
>    Private Sub cmdSetup_Click(ByVal sender As System.Object, ByVal e As
> System.EventArgs) Handles cmdSetup.Click
>        Dim table As DataTable = New DataTable("Flowchart")
>
>        Dim myDataColumn As DataColumn
>        myDataColumn = New DataColumn
>        myDataColumn.DataType = GetType(System.String)
>        myDataColumn.ColumnName = "Flowchart"
>        myDataColumn.AutoIncrement = False
>        myDataColumn.Caption = "Flowchart"
>        myDataColumn.Unique = False
>        table.Columns.Add(myDataColumn)
>
>        ' Hidden column for object type
>        myDataColumn = New DataColumn
>        myDataColumn.DataType = GetType(System.Double)
>        myDataColumn.ColumnName = "ObjectType"
>        myDataColumn.AutoIncrement = False
>        myDataColumn.Caption = "ObjectType"
>        myDataColumn.Unique = False
>        table.Columns.Add(myDataColumn)
>
>        ' hidden column for sort string
>        myDataColumn = New DataColumn
>        myDataColumn.DataType = GetType(System.String)
>        myDataColumn.ColumnName = "Sort"
>        myDataColumn.AutoIncrement = False
>        myDataColumn.Caption = "Sort"
>        myDataColumn.Unique = False
>        table.Columns.Add(myDataColumn)
>
>        Dim dataview As New DataView(table)
>        dataview.Sort = "ObjectType, Sort"
>        grdFlowChartOrig.DataSource = dataview
>
>        AddFlowChartRow(2, "A")
>        AddFlowChartRow(3, "B")
>        AddFlowChartRow(1, "C")
>        AddFlowChartRow(4, "D")
>
>        AddFlowChartColumn(table)
>        AddFlowChartColumn(table)
>        AddFlowChartColumn(table)
>
>        AddFlowChartRow(2, "A")
>        AddFlowChartRow(3, "B")
>        AddFlowChartRow(1, "C")
>        AddFlowChartRow(4, "D")
>
>        grdFlowChartOrig.Refresh()
>
>    End Sub
>
>
>    Private Sub cmdError_Click(ByVal sender As System.Object, ByVal e As
> System.EventArgs) Handles cmdError.Click
>        Dim objTable As DataTable = DirectCast(grdFlowChartOrig.DataSource,
> DataView).Table
>        Dim objView As DataView = DirectCast(grdFlowChartOrig.DataSource,
> DataView)
>
>        objTable.Rows.Clear()
>        objTable.BeginLoadData()
>        While objTable.Columns.Count > 3
>            objTable.Columns.RemoveAt(objTable.Columns.Count - 1)
>        End While
>
>        AddFlowChartRow(3, "E")
>        AddFlowChartRow(1, "E")
>        AddFlowChartRow(2, "E")
>
>        AddFlowChartColumn(objTable)
>        objTable.EndLoadData()
>        objTable.AcceptChanges()
>    End Sub
>
>
>    Public Sub AddFlowChartRow(ByVal nObjectType As Double, Optional ByVal
> strSort As String = "")
>        Static i As Integer = 0
>
>        Dim objTable As DataTable = DirectCast(grdFlowChartOrig.DataSource,
> DataView).Table
>        Dim objRow As DataRow = objTable.NewRow()
>        objRow(0) = "row" & CStr(i)
>        objRow(1) = nObjectType
>        objRow(2) = strSort
>        objTable.Rows.Add(objRow)
>        i = i + 1
>    End Sub
>
>    Public Sub AddFlowChartColumn(ByVal objTable As DataTable)
>        Static i As Integer = 0
>
>        Dim myDataColumn As New DataColumn
>        myDataColumn.DataType = GetType(System.String)
>        myDataColumn.ColumnName = "new column" & CStr(i)
>        myDataColumn.AutoIncrement = False
>        myDataColumn.Caption = "new column" & CStr(i)
>        myDataColumn.Unique = False
>        objTable.Columns.Add(myDataColumn) ' ERROR THROWN HERE
>
>        i = i + 1
>    End Sub
>
>
> End Class
>
> -------------------- END FORM CODE ---------------------------
>
>
>
> -------------------- BEGIN DESIGNER CODE --------------------
> <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
> Partial Class Form1
>    Inherits System.Windows.Forms.Form
>
>    'Form overrides dispose to clean up the component list.
>    <System.Diagnostics.DebuggerNonUserCode()> _
>    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
>        Try
>            If disposing AndAlso components IsNot Nothing Then
>                components.Dispose()
>            End If
>        Finally
>            MyBase.Dispose(disposing)
>        End Try
>    End Sub
>
>    'Required by the Windows Form Designer
>    Private components As System.ComponentModel.IContainer
>
>    'NOTE: The following procedure is required by the Windows Form Designer
>    'It can be modified using the Windows Form Designer.
>    'Do not modify it using the code editor.
>    <System.Diagnostics.DebuggerStepThrough()> _
>    Private Sub InitializeComponent()
>        Me.grdFlowChartOrig = New System.Windows.Forms.DataGridView
>        Me.cmdSetup = New System.Windows.Forms.Button
>        Me.cmdError = New System.Windows.Forms.Button
>        CType(Me.grdFlowChartOrig,
> System.ComponentModel.ISupportInitialize).BeginInit()
>        Me.SuspendLayout()
>        '
>        'grdFlowChartOrig
>        '
>        Me.grdFlowChartOrig.ColumnHeadersHeightSizeMode =
> System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
>        Me.grdFlowChartOrig.Location = New System.Drawing.Point(12, 35)
>        Me.grdFlowChartOrig.Name = "grdFlowChartOrig"
>        Me.grdFlowChartOrig.Size = New System.Drawing.Size(423, 169)
>        Me.grdFlowChartOrig.TabIndex = 0
>        '
>        'cmdSetup
>        '
>        Me.cmdSetup.Location = New System.Drawing.Point(454, 49)
>        Me.cmdSetup.Name = "cmdSetup"
>        Me.cmdSetup.Size = New System.Drawing.Size(100, 58)
>        Me.cmdSetup.TabIndex = 1
>        Me.cmdSetup.Text = "Setup"
>        Me.cmdSetup.UseVisualStyleBackColor = True
>        '
>        'cmdError
>        '
>        Me.cmdError.Location = New System.Drawing.Point(457, 129)
>        Me.cmdError.Name = "cmdError"
>        Me.cmdError.Size = New System.Drawing.Size(97, 58)
>        Me.cmdError.TabIndex = 2
>        Me.cmdError.Text = "Trigger Error"
>        Me.cmdError.UseVisualStyleBackColor = True
>        '
>        'Form1
>        '
>        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
>        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
>        Me.ClientSize = New System.Drawing.Size(580, 253)
>        Me.Controls.Add(Me.cmdError)
>        Me.Controls.Add(Me.cmdSetup)
>        Me.Controls.Add(Me.grdFlowChartOrig)
>        Me.Name = "Form1"
>        Me.Text = "Form1"
>        CType(Me.grdFlowChartOrig,
> System.ComponentModel.ISupportInitialize).EndInit()
>        Me.ResumeLayout(False)
>
>    End Sub
>    Friend WithEvents grdFlowChartOrig As System.Windows.Forms.DataGridView
>    Friend WithEvents cmdSetup As System.Windows.Forms.Button
>    Friend WithEvents cmdError As System.Windows.Forms.Button
>
> End Class
> ------------------------- END DESIGNER
> CODE ---------------------------------
>
>
> "Cor Ligthert [MVP]" wrote:
>
>> SVBridget,
>>
>> Probably there is something wrong in your code, but that we cannot see.
>> Mostly it helps if we can see that as well, because you cannot find the
>> reason even with that code.
>>
>> Therefore maybe it will help if you show the relevant parts of that
>>
>> Cor
>>
>> "svbridget" <svbrid***@discussions.microsoft.com> schreef in bericht
>> news:2EB523E0-5D2F-4A76-89E2-C42DE7C463BA@microsoft.com...
>> > Since upgrading to the 2.0 framework I am getting an error that was not
>> > present in 1.1.  I have a grid that is bound to a DataView, which was
>> > initialized with a DataTable.  I set up the initial rows & cols in the
>> > DataTable, create the DataView, and bind the grid to it.  After that, I
>> > try
>> > to add a column to DataTable.Columns, and I get this error:
>> >
>> > "There is no row at position 0."
>> >
>> >   at System.Data.DataView?.GetRecord?(Int32 recordIndex)
>> >   at System.Data.DataView?.GetRow?(Int32 index)
>> >   at System.Data.DataView?.UpdateDataRowViewCache?()
>> >   at System.Data.DataView?.OnListChanged?(ListChangedEventArgs? e)
>> >   at System.Data.DataView?.ColumnCollectionChanged?(Object sender,
>> > CollectionChangeEventArgs? e)
>> >   at System.Data.DataViewListener?.ColumnCollectionChanged?(Object
>> > sender,
>> > CollectionChangeEventArgs? e)
>> >   at
>> > System.Data.DataColumnCollection?.OnCollectionChanged?(CollectionChangeEventArgs?
>> > ccevent)
>> >   at System.Data.DataColumnCollection?.AddAt?(Int32 index, DataColumn?
>> > column)
>> >   at System.Data.DataColumnCollection?.Add(DataColumn? column)
>> >
>> > I can't fathom why the code for adding a column is trying to update the
>> > _row_ cache of the DataView.  Also it doesn't seem to matter that there
>> > actually is a row at position 0...
>> >
>> > As a workaround I am setting the DataView's DataTable to Nothing,
>> > adding
>> > the
>> > column, then setting the DataView's DataTable back to the DataTable.
>> >
>> > But if someone could explain why this is happening in 2.0 I would
>> > appreciate
>> > it.
>> >
>> > Thanks.
>> >
>> >
>>
>>
>>
Author
3 Nov 2006 9:51 PM
svbridget
Thanks for looking at this, Cor, I appreciate it.  I couldn't find a good
spot to put this on the connect.microsoft.com site (maybe you have access to
something that I don't have) so I called MS support and filed a bug.  I will
post whatever MS responds with here.

Show quote
"Cor Ligthert [MVP]" wrote:

> B,
>
> I tried it and did look even a quiet long while to it, I commit it is
> strange, maybe you can drop this code at
>
> http://connect.microsoft.com/Main/content/content.aspx?ContentID=2220
>
> Cor
>
> "svbridget" <svbrid***@discussions.microsoft.com> schreef in bericht
> news:474BCFB9-4C1B-4EC6-911A-3F05DFFE77C0@microsoft.com...
> > Sure, here's the repro code.  Also as I noted previously this did not
> > throw
> > an error in 1.1.
> >
> > I am including the form code and the designer code below. Click Setup,
> > then
> > click Error, and the error will appear.
> >
> > I currently have two workarounds: a) set the dataview's datasource to
> > nothing, add the column, then set it back to datatable b) take out
> > beginloaddata and endloaddata.
> >
> > -B
> >
> > -------------------- BEGIN FORM CODE ------------------------
> > Imports System.Data
> >
> > Public Class Form1
> >
> >    Private Sub cmdSetup_Click(ByVal sender As System.Object, ByVal e As
> > System.EventArgs) Handles cmdSetup.Click
> >        Dim table As DataTable = New DataTable("Flowchart")
> >
> >        Dim myDataColumn As DataColumn
> >        myDataColumn = New DataColumn
> >        myDataColumn.DataType = GetType(System.String)
> >        myDataColumn.ColumnName = "Flowchart"
> >        myDataColumn.AutoIncrement = False
> >        myDataColumn.Caption = "Flowchart"
> >        myDataColumn.Unique = False
> >        table.Columns.Add(myDataColumn)
> >
> >        ' Hidden column for object type
> >        myDataColumn = New DataColumn
> >        myDataColumn.DataType = GetType(System.Double)
> >        myDataColumn.ColumnName = "ObjectType"
> >        myDataColumn.AutoIncrement = False
> >        myDataColumn.Caption = "ObjectType"
> >        myDataColumn.Unique = False
> >        table.Columns.Add(myDataColumn)
> >
> >        ' hidden column for sort string
> >        myDataColumn = New DataColumn
> >        myDataColumn.DataType = GetType(System.String)
> >        myDataColumn.ColumnName = "Sort"
> >        myDataColumn.AutoIncrement = False
> >        myDataColumn.Caption = "Sort"
> >        myDataColumn.Unique = False
> >        table.Columns.Add(myDataColumn)
> >
> >        Dim dataview As New DataView(table)
> >        dataview.Sort = "ObjectType, Sort"
> >        grdFlowChartOrig.DataSource = dataview
> >
> >        AddFlowChartRow(2, "A")
> >        AddFlowChartRow(3, "B")
> >        AddFlowChartRow(1, "C")
> >        AddFlowChartRow(4, "D")
> >
> >        AddFlowChartColumn(table)
> >        AddFlowChartColumn(table)
> >        AddFlowChartColumn(table)
> >
> >        AddFlowChartRow(2, "A")
> >        AddFlowChartRow(3, "B")
> >        AddFlowChartRow(1, "C")
> >        AddFlowChartRow(4, "D")
> >
> >        grdFlowChartOrig.Refresh()
> >
> >    End Sub
> >
> >
> >    Private Sub cmdError_Click(ByVal sender As System.Object, ByVal e As
> > System.EventArgs) Handles cmdError.Click
> >        Dim objTable As DataTable = DirectCast(grdFlowChartOrig.DataSource,
> > DataView).Table
> >        Dim objView As DataView = DirectCast(grdFlowChartOrig.DataSource,
> > DataView)
> >
> >        objTable.Rows.Clear()
> >        objTable.BeginLoadData()
> >        While objTable.Columns.Count > 3
> >            objTable.Columns.RemoveAt(objTable.Columns.Count - 1)
> >        End While
> >
> >        AddFlowChartRow(3, "E")
> >        AddFlowChartRow(1, "E")
> >        AddFlowChartRow(2, "E")
> >
> >        AddFlowChartColumn(objTable)
> >        objTable.EndLoadData()
> >        objTable.AcceptChanges()
> >    End Sub
> >
> >
> >    Public Sub AddFlowChartRow(ByVal nObjectType As Double, Optional ByVal
> > strSort As String = "")
> >        Static i As Integer = 0
> >
> >        Dim objTable As DataTable = DirectCast(grdFlowChartOrig.DataSource,
> > DataView).Table
> >        Dim objRow As DataRow = objTable.NewRow()
> >        objRow(0) = "row" & CStr(i)
> >        objRow(1) = nObjectType
> >        objRow(2) = strSort
> >        objTable.Rows.Add(objRow)
> >        i = i + 1
> >    End Sub
> >
> >    Public Sub AddFlowChartColumn(ByVal objTable As DataTable)
> >        Static i As Integer = 0
> >
> >        Dim myDataColumn As New DataColumn
> >        myDataColumn.DataType = GetType(System.String)
> >        myDataColumn.ColumnName = "new column" & CStr(i)
> >        myDataColumn.AutoIncrement = False
> >        myDataColumn.Caption = "new column" & CStr(i)
> >        myDataColumn.Unique = False
> >        objTable.Columns.Add(myDataColumn) ' ERROR THROWN HERE
> >
> >        i = i + 1
> >    End Sub
> >
> >
> > End Class
> >
> > -------------------- END FORM CODE ---------------------------
> >
> >
> >
> > -------------------- BEGIN DESIGNER CODE --------------------
> > <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
> > Partial Class Form1
> >    Inherits System.Windows.Forms.Form
> >
> >    'Form overrides dispose to clean up the component list.
> >    <System.Diagnostics.DebuggerNonUserCode()> _
> >    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
> >        Try
> >            If disposing AndAlso components IsNot Nothing Then
> >                components.Dispose()
> >            End If
> >        Finally
> >            MyBase.Dispose(disposing)
> >        End Try
> >    End Sub
> >
> >    'Required by the Windows Form Designer
> >    Private components As System.ComponentModel.IContainer
> >
> >    'NOTE: The following procedure is required by the Windows Form Designer
> >    'It can be modified using the Windows Form Designer.
> >    'Do not modify it using the code editor.
> >    <System.Diagnostics.DebuggerStepThrough()> _
> >    Private Sub InitializeComponent()
> >        Me.grdFlowChartOrig = New System.Windows.Forms.DataGridView
> >        Me.cmdSetup = New System.Windows.Forms.Button
> >        Me.cmdError = New System.Windows.Forms.Button
> >        CType(Me.grdFlowChartOrig,
> > System.ComponentModel.ISupportInitialize).BeginInit()
> >        Me.SuspendLayout()
> >        '
> >        'grdFlowChartOrig
> >        '
> >        Me.grdFlowChartOrig.ColumnHeadersHeightSizeMode =
> > System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
> >        Me.grdFlowChartOrig.Location = New System.Drawing.Point(12, 35)
> >        Me.grdFlowChartOrig.Name = "grdFlowChartOrig"
> >        Me.grdFlowChartOrig.Size = New System.Drawing.Size(423, 169)
> >        Me.grdFlowChartOrig.TabIndex = 0
> >        '
> >        'cmdSetup
> >        '
> >        Me.cmdSetup.Location = New System.Drawing.Point(454, 49)
> >        Me.cmdSetup.Name = "cmdSetup"
> >        Me.cmdSetup.Size = New System.Drawing.Size(100, 58)
> >        Me.cmdSetup.TabIndex = 1
> >        Me.cmdSetup.Text = "Setup"
> >        Me.cmdSetup.UseVisualStyleBackColor = True
> >        '
> >        'cmdError
> >        '
> >        Me.cmdError.Location = New System.Drawing.Point(457, 129)
> >        Me.cmdError.Name = "cmdError"
> >        Me.cmdError.Size = New System.Drawing.Size(97, 58)
> >        Me.cmdError.TabIndex = 2
> >        Me.cmdError.Text = "Trigger Error"
> >        Me.cmdError.UseVisualStyleBackColor = True
> >        '
> >        'Form1
> >        '
> >        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
> >        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
> >        Me.ClientSize = New System.Drawing.Size(580, 253)
> >        Me.Controls.Add(Me.cmdError)
> >        Me.Controls.Add(Me.cmdSetup)
> >        Me.Controls.Add(Me.grdFlowChartOrig)
> >        Me.Name = "Form1"
> >        Me.Text = "Form1"
> >        CType(Me.grdFlowChartOrig,
> > System.ComponentModel.ISupportInitialize).EndInit()
> >        Me.ResumeLayout(False)
> >
> >    End Sub
> >    Friend WithEvents grdFlowChartOrig As System.Windows.Forms.DataGridView
> >    Friend WithEvents cmdSetup As System.Windows.Forms.Button
> >    Friend WithEvents cmdError As System.Windows.Forms.Button
> >
> > End Class
> > ------------------------- END DESIGNER
> > CODE ---------------------------------
> >
> >
> > "Cor Ligthert [MVP]" wrote:
> >
> >> SVBridget,
> >>
> >> Probably there is something wrong in your code, but that we cannot see.
> >> Mostly it helps if we can see that as well, because you cannot find the
> >> reason even with that code.
> >>
> >> Therefore maybe it will help if you show the relevant parts of that
> >>
> >> Cor
> >>
> >> "svbridget" <svbrid***@discussions.microsoft.com> schreef in bericht
> >> news:2EB523E0-5D2F-4A76-89E2-C42DE7C463BA@microsoft.com...
> >> > Since upgrading to the 2.0 framework I am getting an error that was not
> >> > present in 1.1.  I have a grid that is bound to a DataView, which was
> >> > initialized with a DataTable.  I set up the initial rows & cols in the
> >> > DataTable, create the DataView, and bind the grid to it.  After that, I
> >> > try
> >> > to add a column to DataTable.Columns, and I get this error:
> >> >
> >> > "There is no row at position 0."
> >> >
> >> >   at System.Data.DataView?.GetRecord?(Int32 recordIndex)
> >> >   at System.Data.DataView?.GetRow?(Int32 index)
> >> >   at System.Data.DataView?.UpdateDataRowViewCache?()
> >> >   at System.Data.DataView?.OnListChanged?(ListChangedEventArgs? e)
> >> >   at System.Data.DataView?.ColumnCollectionChanged?(Object sender,
> >> > CollectionChangeEventArgs? e)
> >> >   at System.Data.DataViewListener?.ColumnCollectionChanged?(Object
> >> > sender,
> >> > CollectionChangeEventArgs? e)
> >> >   at
> >> > System.Data.DataColumnCollection?.OnCollectionChanged?(CollectionChangeEventArgs?
> >> > ccevent)
> >> >   at System.Data.DataColumnCollection?.AddAt?(Int32 index, DataColumn?
> >> > column)
> >> >   at System.Data.DataColumnCollection?.Add(DataColumn? column)
> >> >
> >> > I can't fathom why the code for adding a column is trying to update the
> >> > _row_ cache of the DataView.  Also it doesn't seem to matter that there
> >> > actually is a row at position 0...
> >> >
> >> > As a workaround I am setting the DataView's DataTable to Nothing,
> >> > adding
> >> > the
> >> > column, then setting the DataView's DataTable back to the DataTable.
> >> >
> >> > But if someone could explain why this is happening in 2.0 I would
> >> > appreciate
> >> > it.
> >> >
> >> > Thanks.
> >> >
> >> >
> >>
> >>
> >>
>
>
>

AddThis Social Bookmark Button