2014-09-29 3 views
1

Хороший обмен стоп-качками. Это мой первый пост здесь. Мне нужна ваша помощь в этой проблеме, которую я получил с DataTable и Datarow. Вот ошибка:Вставка в DataTable и DataRow: Индекс за пределами допустимого диапазона

Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

^Это происходит и указывает на dataGridView1 [0] индекс

Вот мой код:

static DataTable dtTest = GetTable(); 

    static DataTable GetTable() 
    { 
     //added 4 columns with an incremental id 

     DataTable dt = new DataTable(); 
     dt.Columns.Add("ID"); 
     dt.Columns["ID"].AutoIncrement = true; 
     dt.Columns.Add("item"); 
     dt.Columns.Add("qty", typeof(decimal)); 
     dt.Columns.Add("amount", typeof(decimal)); 
     return dt; 
    } 

    private void btnInsert_Click(object sender, EventArgs e) 
    { 
      //added 3 rows to hold data to be inserted to DataTable 

      DataRow myRow; 

      myRow = dt.NewRow(); 
      myRow["item"] = txtItem.Text; 
      myRow["qty"] = Convert.ToDecimal(txtQty.Text); 
      myRow["amount"] = Convert.ToDecimal(txtAmount.Text); 
      dtTest.Rows.Add(myRow); 

      refreshItemGrid(); 
    } 

    private void refreshItemGrid() 
    { 
     dataGridView1.Refresh(); 
     dataGridView1.Columns[0].Visible = false;    // ID 
     dataGridView1.Columns[1].HeaderText = "ITEM";   // item 
     dataGridView1.Columns[2].HeaderText = "QUANTITY";  // qty 
     dataGridView1.Columns[3].HeaderText = "AMOUNT";  // amount 
    } 

Где я делаю неправильно здесь? Заранее спасибо за помощь. Ура!

+1

Где вы привязываете dtTest к dataGridView1? Пока вы не свяжете их, нет столбцов для использования в dataGridView – Steve

+0

Я ранее пробовал «dataGridView1.DataSource = dtTest» для привязки моего datagridview, но это та же ошибка – Markov

+0

И каково значение свойства AutoGenerateColumns? Он должен быть установлен в True (это значение по умолчанию, но давайте проверим его ...), и, кстати, я полагаю, что это опечатка, но вы не можете создать NewRow из таблицы и добавить в другую таблицу – Steve

ответ

0

Ваша ошибка связана с отсутствием связывания между dataGridView1 и таблицей, созданной в методе GetTable. Так что вам нужно куда-то деть линию

dataGridView1.DataSource = <table_returned_from_GetTable_call>; 

я ставлю эту строку таким образом, потому что это не ясно из кода выше, где эта строка должна быть добавлена. Разумеется, вызов события bntInsert должен иметь это место раньше.

В дополнение к этому вы должны быть уверены, что свойство AutoGenerateColumns установлено значение True.
(Это значение по умолчанию, но, учитывая контекст, возможно, что вы случайно установили его ложно). Наконец (и это, вероятно, просто опечатка) вам нужно исправить

myRow = dtTest.NewRow(); 
+0

ответ был в AutoGenerateColumns равным true. Spasibo. – Markov