MukulMohal Ответов: 2

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


Я создаю приложение для windows на языке c#. При использовании datagridview я получаю эту ошибку.

protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg,System.Windows.Forms.Keys keyData)
        {
            if (keyData == Keys.Enter)
            {
                // ON ENTER KEY, GO TO THE NEXT CELL. 
                // WHEN THE CURSOR REACHES THE LAST COLUMN, CARRY IT ON TO THE NEXT ROW.

                if (ActiveControl.Name == "grdsearch")
                {
                    // CHECK IF ITS THE LAST COLUMN
                    if (grdsearch.CurrentCell.ColumnIndex == grdsearch.ColumnCount - 1)
                    {
                        // GO TO THE FIRST COLUMN, NEXT ROW.
                        grdsearch.CurrentCell =
                            grdsearch.Rows[grdsearch.CurrentCell.RowIndex + 1]
                                .Cells[0];
                    }
                    else
                    {
                        // NEXT COLUMN.
                        grdsearch.CurrentCell =
                            grdsearch.Rows[grdsearch.CurrentRow.Index]
                            .Cells[grdsearch.CurrentCell.ColumnIndex + 1];
                    }

                    return true;
                }
                else if (ActiveControl is DataGridViewTextBoxEditingControl)
                {
                    // SHOW THE COMBOBOX WHEN FOCUS IS ON A CELL CORRESPONDING TO THE "QUALIFICATION" COLUMN.
                    if (grdsearch.Columns
                        [grdsearch.CurrentCell.ColumnIndex].Name == "Item_Description")
                    {
                        grdsearch.CurrentCell =
                            grdsearch.Rows[grdsearch.CurrentRow.Index]
                                .Cells[grdsearch.CurrentCell.ColumnIndex + 1];

                        // SHOW COMBOBOX.
                        Show_Combobox(grdsearch.CurrentRow.Index,
                            grdsearch.CurrentCell.ColumnIndex);

                        SendKeys.Send("{F4}");      // DROP DOWN THE LIST.
                        return true;
                    }
                    else
                    {
                        // CHECK IF ITS THE LAST COLUMN.
                        if (grdsearch.CurrentCell.ColumnIndex ==
                            grdsearch.ColumnCount - 1)
                        {
                            // GO TO THE FIRST COLUMN, NEXT ROW.
                            grdsearch.CurrentCell =
                                grdsearch.Rows[grdsearch.CurrentCell.RowIndex + 1]
                                    .Cells[0];
                        }
                        else
                        {
                            // NEXT COLUMN.
                            grdsearch.CurrentCell =
                                grdsearch.Rows[grdsearch.CurrentRow.Index]
                                    .Cells[grdsearch.CurrentCell.ColumnIndex + 1];
                        }
                        return true;
                    }
                }
                else if (ActiveControl.Name == "ComboBox1")
                {
                    // HIDE THE COMBOBOX AND ASSIGN COMBO'S VALUE TO THE CELL.
                    grdsearch.Visible = false;

                    grdsearch.Focus();

                    // ONCE THE COMBO IS SET AS INVISIBLE, SET FOCUS BACK TO THE GRID. (IMPORTANT)
                    grdsearch[grdsearch.CurrentCell.ColumnIndex,
                    grdsearch.CurrentRow.Index].Value = grdsearch.Text;

                    grdsearch.CurrentCell =
                        grdsearch.Rows[grdsearch.CurrentRow.Index]
                            .Cells[grdsearch.CurrentCell.ColumnIndex + 1];
                }
                else
                {
                    SendKeys.Send("{TAB}");
                }
                return true;
            }
            else if (keyData == Keys.Escape)            // PRESS ESCAPE TO HIDE THE COMBOBOX.
            {
                if (ActiveControl.Name == "ComboBox1")
                {
                    
                    HSN_Code.Visible = false;

                    grdsearch.CurrentCell =
                        grdsearch.Rows[grdsearch.CurrentCell.RowIndex]
                            .Cells[grdsearch.CurrentCell.ColumnIndex];

                    grdsearch.Focus();
                }
                return true;
            }
            else
            {
                return base.ProcessCmdKey(ref msg, keyData);
            }
        }


Что я уже пробовал:

Я получаю ошибку внутри

if (grdsearch.CurrentCell.ColumnIndex == grdsearch.ColumnCount - 1)
                    {
                        // GO TO THE FIRST COLUMN, NEXT ROW.
                        grdsearch.CurrentCell =
                            grdsearch.Rows[grdsearch.CurrentCell.RowIndex + 1]
                                .Cells[0];
                    }


можете вы пожалуйста помочь мне...
Я добавил столбец в представление datagrid программно.

2 Ответов

Рейтинг:
15

Thomas Daniels

Это происходит потому, что CurrentCell.RowIndex + 1 это больше, чем самый высокий индекс ваших строк-другими словами, ошибка происходит, когда вы находитесь на последнем столбце и на последней строке, потому что нет никакой "следующей строки".

Добавить if оператор для проверки наличия следующей строки и вызова только этого фрагмента кода, если он существует.


MukulMohal

да, я сделал это и обновил свой код, и я смог перейти от 1 строки к другой строке, но это работало до 2-й строки. он снова выдает то же самое исключение при попытке перейти со 2-го ряда на 3-й ряд.

если (grdsearch.CurrentCell.Значение columnindex == grdsearch.ColumnCount - 1)
{
col = 0;
ряд++;
// ПЕРЕЙТИ К ПЕРВОЙ КОЛОНКЕ, ДАЛЕЕ
grdsearch.CurrentCell =grdsearch[col,row];
}

int col = grdsearch.CurrentCell.Значение columnindex;
строки = grdsearch.CurrentCell.Параметр rowindex;

ДОБАВЛЕН
Невров строкаданных = таблица.Невров();
стол.Строк.Добавить(невров);
В МОЕМ КОДЕ ПРИВЯЗКИ СЕТКИ

Thomas Daniels

Но и в этом коде, после row++, вы не проверяете, существует ли эта строка на самом деле...

MukulMohal

нет, я не проверял, существует ли какая-либо строка. Поскольку моя datagrid была привязана к источнику данных, поэтому я не могу добавлять строки в сетку напрямую, поэтому я просто добавил строку в datatable. Есть ли способ добавить строку во время выполнения в datatable

Thomas Daniels

Я не знаю, сможете ли вы это сделать, и поскольку я действительно не знаю, что вы хотите сделать, я также не могу сказать, Как правильно это сделать. Но если вы не хотите IndexOurOfRange, то сделайте проверку, прежде чем пытаться получить доступ к строке.

MukulMohal

установив флажок Включить добавление свойства представления таблицы данных, я смог добавить новую строку в представление таблицы во время выполнения. И я хочу сделать сетку, где я могу добавить детали товара вместе с количеством, его ценой и общей суммой.
таким образом, может быть несколько строк.

[no name]

Спасибо!

Рейтинг:
0

Patrice T

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

Где вы проверяете, что есть следующий ряд ?