Исключение «Индекс вышел за пределы диапазона», выданное в событии DataGridView SelectionChanged, в то время как FormLoad - PullRequest
1 голос
/ 03 февраля 2020

Я заполнил свой DataGridView с именем DataSourceGrid, используя следующий код внутри FormLoad

String mquery = "SELECT ProductName,UnitPrice,CategoryName FROM ProductsTable INNER JOIN CategoryTable ON ProductsTable.Categoryid = CategoryTable.Categoryid";
                using (SqlConnection con = new SqlConnection(conString))
                {
                    SqlDataAdapter sda = new SqlDataAdapter(mquery, con);
                    con.Open();
                    DataTable dt = new DataTable();
                    sda.Fill(dt);
                    DataSourceGrid.DataSource = dt;

                }

Я использовал следующий код для выбора строк DataGridView внутри SelectionChanged блока событий

                int curRow = -1;
                int curColumn = -1;
                curRow = DataSourceGrid.CurrentRow.Index;
                curColumn = DataSourceGrid.CurrentCell.ColumnIndex;
                string firstCellValue = DataSourceGrid.SelectedRows[curRow].Cells[curColumn].Value.ToString();
                if (DataSourceGrid.CurrentRow.Index >= -1)
                {
using (SqlConnection con = new SqlConnection(conString))
                    {

                        String query = "SELECT ProductName,UnitPrice,CategoryName FROM ProductsTable INNER JOIN CategoryTable ON ProductsTable.Categoryid = CategoryTable.Categoryid WHERE ProductName='" + firstCellValue + "'";
                        con.Open();
                        SqlDataReader sdr = new SqlCommand(query, con).ExecuteReader();
                        sdr.Read();
                        ProductNameText.Text = sdr.GetValue(0).ToString();
                        UnitPriceText.Text = sdr.GetValue(1).ToString();
                        CategoryText.Text = sdr.GetValue(2).ToString();

                    }

, когда я нажимаю на строку, данные будут отображаться в соответствующих текстовых полях. Моя проблема в том, что когда FormLoad выдается исключение, говорящее Index was out of range... Вот Точное Исключение спасибо за вашу поддержку.

1 Ответ

0 голосов
/ 03 февраля 2020

Измените свой код следующим образом:

                int curRow = DataSourceGrid.CurrentRow.Index;
                int curColumn = DataSourceGrid.CurrentCell.ColumnIndex;

                // First check for -1 and then do the rest.
                if (curRow > -1 && curColumn > -1)
                {
                    string firstCellValue = DataSourceGrid.SelectedRows[curRow].Cells[curColumn].Value.ToString();

Массивы имеют индексы от 0 до Length-1, поэтому, если индекс равен -1, то это то, что говорит исключение OutOfIndex

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

if (curRow >= -1 && curColumn >= -1)
{
    curRow = curRow == -1 ? 0 : curRow;
    curColumn = curColumn == -1 ? 0 : curColumn;
    string firstCellValue = DataSourceGrid.SelectedRows[curRow].Cells[curColumn].Value.ToString();
...