简体   繁体   中英

“No row can be added to a DataGridView control that does not have columns. Columns must be added first.” when adding rows to DataTable

I'm getting the following message when trying to add rows to a DataTable: “No row can be added to a DataGridView control that does not have columns. Columns must be added first.” Interestingly enough, the DataTable that I'm trying to add the row to does have three columns at the point when the row is being added. It seems like the failure is occurring on the currency manager, way down in the row-insertion stack. Here's my code:

    Using DT As DataTable = Me.Tables(TableNamePrefix & " " & CStr(Index + 1))
        DT.Rows.Clear()
        DT.Columns.Clear()

        For Each LF As cLoadField In LFs
            LF.UseDefaultUnits(DispOpt.Units, DispOpt.Format)
            DT.Columns.Add(LF.Name(Cond)).Caption = LF.Name(Cond)
            If Not LF.UnitString(DispOpt) = "" Then
                DT.Columns(LF.Name(Cond)).Caption = LF.Name(Cond) & vbCrLf & LF.UnitString(DispOpt)
            End If
            If LF.FieldType = hecLoadFields.hecLF_LengthPaidOut Then LPO_Name = LF.Name(Cond)
        Next

        For Each HW As CHawser In Hawsers
            If Not Cond.Loads.NameExists(HW.Name) Then Continue For

            DR = DT.NewRow
            For Each LF As cLoadField In LFs
                LF.TankName = HW.Name
                DR(LF.Name(Cond)) = LF.Value(Cond)
            Next
            DT.Rows.Add(DR)
        Next
    End Using

And here's the call stack:

System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRowCollection.InsertInternal(int rowIndex, System.Windows.Forms.DataGridViewRow dataGridViewRow, bool force) + 0x342 bytes    
System.Windows.Forms.dll!System.Windows.Forms.DataGridView.DataGridViewDataConnection.ProcessListChanged(System.ComponentModel.ListChangedEventArgs e) + 0x5ed bytes    
System.Windows.Forms.dll!System.Windows.Forms.DataGridView.DataGridViewDataConnection.currencyManager_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e) + 0x2b bytes 
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.OnListChanged(System.ComponentModel.ListChangedEventArgs e) + 0x15 bytes  
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.List_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e) + 0x53e bytes   
System.Data.dll!System.Data.DataView.OnListChanged(System.ComponentModel.ListChangedEventArgs e) + 0x136 bytes  
System.Data.dll!System.Data.DataView.IndexListChanged(object sender, System.ComponentModel.ListChangedEventArgs e) + 0x1c bytes 
System.Data.dll!System.Data.DataView.IndexListChangedInternal(System.ComponentModel.ListChangedEventArgs e) + 0x47 bytes    
System.Data.dll!System.Data.DataViewListener.IndexListChanged(System.ComponentModel.ListChangedEventArgs e) + 0x3b bytes    
System.Data.dll!System.Data.Index.OnListChanged.AnonymousMethod__2(System.Data.DataViewListener listener, System.ComponentModel.ListChangedEventArgs args, bool arg2, bool arg3) + 0x7 bytes    
System.Data.dll!System.Data.Listeners<System.__Canon>.Notify<System.__Canon,bool,bool>(System.__Canon arg1, bool arg2, bool arg3, System.Data.Listeners<System.__Canon>.Action<System.__Canon,System.__Canon,bool,bool> action) + 0x90 bytes    
System.Data.dll!System.Data.Index.OnListChanged(System.ComponentModel.ListChangedEventArgs e) + 0xa4 bytes  
System.Data.dll!System.Data.Index.OnListChanged(System.ComponentModel.ListChangedType changedType, int index) + 0x38 bytes  
System.Data.dll!System.Data.Index.InsertRecord(int record, bool fireEvent) + 0xdf bytes 
System.Data.dll!System.Data.Index.ApplyChangeAction(int record, int action, int changeRecord) + 0x34 bytes  
System.Data.dll!System.Data.Index.RecordStateChanged(int record, System.Data.DataViewRowState oldState, System.Data.DataViewRowState newState) + 0x40 bytes 
System.Data.dll!System.Data.DataTable.RecordStateChanged(int record1, System.Data.DataViewRowState oldState1, System.Data.DataViewRowState newState1, int record2, System.Data.DataViewRowState oldState2, System.Data.DataViewRowState newState2) + 0xaf bytes 
System.Data.dll!System.Data.DataTable.SetNewRecordWorker(System.Data.DataRow row, int proposedRecord, System.Data.DataRowAction action, bool isInMerge, bool suppressEnsurePropertyChanged, int position, bool fireEvent, out System.Exception deferredException) + 0x540 bytes 
System.Data.dll!System.Data.DataTable.InsertRow(System.Data.DataRow row, long proposedID, int pos, bool fireEvent) + 0xf5 bytes 
System.Data.dll!System.Data.DataRowCollection.Add(System.Data.DataRow row) + 0x1a bytes 

Any help would be greatly appreciated!

This DataTable is the DataSource of a DataGridView that lives on my application's main form. It turns out that I didn't set the AutoGenerateColumns property of the DataGridView, which was the source of this error.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM