2015-12-21 1 views
0

При попытке добавить строки в DataTable появляется следующее сообщение:« Никакая строка не может быть добавлена ​​в элемент управления DataGridView, который не имеет столбцов. Столбцы должны быть добавлены первыми ». Интересно, что DataTable, который я пытаюсь добавить в строку до , имеет, имеет три столбца в момент добавления строки. Похоже, что неудача происходит в менеджере валют, вниз в стеке строк. Вот мой код:«Никакой ряд не может быть добавлен в элемент управления DataGridView, который не имеет столбцов. Столбцы должны быть добавлены первыми ». При добавлении строк в DataTable

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 

И вот стек вызовов:

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 

Любая помощь будет принята с благодарностью!

+0

Является ли datatable источником данных сетки где-то? Где ошибка возникает в коде, который вы опубликовали? Перед запуском этого кода попробуйте установить источник данных grid для NOTHING. Вы все еще получаете ошибку? – Steve

+0

Datatable является источником сетки, и я действительно обнаружил, что проблема связана с свойством AutoGenerateColumns сетки. Если у меня нет этого набора, datatable передает столбцы в сетку, которые он не использует, а затем пытается передать строки этой сетке без столбца. Спасибо за помощь! – Serenus

+0

Это то, к чему я стремился. Установка источника данных на ничего должна также предотвращать эту проблему и некоторые другие, с которыми вы можете или не можете столкнуться. – Steve

ответ

0

Этот DataTable является источником данных DataGridView, который живет в основной форме приложения. Оказывается, я не установил свойство AutoGenerateColumns DataGridView, которое было источником этой ошибки.