Вставка в DataTable и DataRow: индекс вне диапазона

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

Индекс был вне допустимого диапазона. Должно быть неотрицательным и меньше размера коллекции. Имя параметра: индекс

^Это происходит и указывает на индекс 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
    }

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


person Markov    schedule 29.09.2014    source источник
comment
Где вы привязываете dtTest к dataGridView1? Пока вы не привяжете их, в dataGridView не будет столбцов для использования.   -  person Steve    schedule 29.09.2014
comment
Ранее я пробовал dataGridView1.DataSource = dtTest для привязки моего представления данных, но это та же ошибка.   -  person Markov    schedule 29.09.2014
comment
И каково значение свойства AutoGenerateColumns? Он должен быть установлен в True (это по умолчанию, но давайте проверим...), и, кстати, я предполагаю, что это опечатка, но вы не можете создать NewRow из таблицы и добавить в другую таблицу   -  person Steve    schedule 29.09.2014
comment
Как я могу проголосовать за ваш комментарий, Стив? это решило это! Спасибо чувак!   -  person Markov    schedule 29.09.2014


Ответы (1)


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

dataGridView1.DataSource = <table_returned_from_GetTable_call>;

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

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

 myRow = dtTest.NewRow();
person Steve    schedule 29.09.2014
comment
ответ был в AutoGenerateColumns на true. спасибо. - person Markov; 29.09.2014