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.