Member 13153537 Ответов: 2

Как отсортировать данные datagridview.когда я нажимаю заголовок столбца в приложении C# windows


У меня есть datagridview в этой кнопке редактирования и удаления.Я загружаю
datagridview из таблицы базы данных.И я нажимаю объекте datagridview кнопку Изменить соответствующие данные показаны в соответствующие текстовые поля нормально.и я нажмите кнопку отправить, данные кнопка сохранения в базе данных и показ объекта datagridview.Для этого используется datagridview cellcontent click event.что я хочу, так это если я нажму на заголовок столбца id в datagridview, данные должны быть отсортированы.Как это сделать.Я получаю аргумент out of Range Exception "Index out of range Exception".Плаз, помоги мне в этом.

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

<blockquote class="quote"><div class="op">Quote:</div> 

    private void dgvwDtls_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            ChqMngrBsns.Masters.BankInfo bnkinfo = new ChqMngrBsns.Masters.BankInfo();

            bnkid = Convert.ToInt32(dgvwDtls.Rows[e.RowIndex].Cells["bankid"].Value);
            if (dgvwDtls.Columns[e.ColumnIndex].Name == "Edit" && e.RowIndex >= 0)
             {
                 txtBnknm.Text = dgvwDtls.Rows[e.RowIndex].Cells["bankname"].Value.ToString();


                 string CTS = dgvwDtls.Rows[e.RowIndex].Cells["Chequetype"].Value.ToString();


                 if (CTS == "True")
                 {
                     rbchqtype1.Checked = true;
                 
                 }

                 else if (CTS == "False")
                 {
                     rbchqtype2.Checked = true;
                 
                 }
                 
                 txtAcntno.Text = dgvwDtls.Rows[e.RowIndex].Cells["Accountno"].Value.ToString();
                 cmbAcntype.Text = dgvwDtls.Rows[e.RowIndex].Cells["Accounttype"].Value.ToString();
                 Isinsert = false;
            }
                else if (dgvwDtls.Columns[e.ColumnIndex].Name == "Delete" && e.RowIndex >= 0)
                {
                    bnkid = Convert.ToInt32(dgvwDtls.Rows[e.RowIndex].Cells["bankid"].Value);
                    DialogResult dr = MessageBox.Show("Are you sure to delete row?", "Confirmation", MessageBoxButtons.YesNo);
                    if (dr == DialogResult.Yes)
                    {
                        bnkinfo.DeleteData(bnkid);
                    }
                    else if (DialogResult == DialogResult.No)
                    {
                        MessageBox.Show("Nothing Deleted");
                    }

                    LoadDataGridView();
                
                
                }


             }</blockquote

RickZeeland

Можете ли вы также показать код, в котором вы устанавливаете datagridview.datasource ?

Member 13153537

Это код для загрузки данных в datagridview

частный недействительными LoadDataGridView()
{
string connection = @ " Data Source=CISBLR-01\SQL2008; Initial Catalog=ChequeManager;Integrated Security=True;";
SqlConnection con = новый SqlConnection(соединение);
Команда sqlcommand cmd и = новая команда sqlcommand("выберите bank_Id,функции row_number() над(приказ [bank_Id]) как сльно,[bank_Name],[bank_Accountno],[bank_Accountype],[bank_Chequetype] от [ДБО].[счет, указанный в разделе] приказ по сльно", кон);
пробовать
{
против.Открыть();
SqlDataAdapter da = новый SqlDataAdapter();
да.Команды selectcommand = ЦМД;
DataTable dt = новый DataTable();
да.Заполнить(ДТ);
dgvwDtls.Источник данных = ДТ;
против.Закрывать();
}
поймать (исключение бывший)
{
Ящик для сообщений.Показать (например, сообщение);
}
}

Member 13153537

Как справиться с этим исключением в моем случае.Пожалуйста, дайте любую ссылку.Заранее спасибо.

RickZeeland

Я думаю, вам нужно проверить: e. RowIndex >= 0

Member 13153537

Я знаю, что это глупый вопрос.Я посвежел.Спасибо за помощь.

2 Ответов

Рейтинг:
7

phil.o

Рикзилэнд прав. Я публикую это второе решение с небольшой поправкой на код, который вы показали:

private void dgvwDtls_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
   if (e.RowIndex > -1) {
      ChqMngrBsns.Masters.BankInfo bnkinfo = new ChqMngrBsns.Masters.BankInfo();
      bnkid = Convert.ToInt32(dgvwDtls.Rows[e.RowIndex].Cells["bankid"].Value);
      if (dgvwDtls.Columns[e.ColumnIndex].Name == "Edit")
      {
         txtBnknm.Text = dgvwDtls.Rows[e.RowIndex].Cells["bankname"].Value.ToString();
         string CTS = dgvwDtls.Rows[e.RowIndex].Cells["Chequetype"].Value.ToString();
         if (CTS == "True")
         {
            rbchqtype1.Checked = true;
         }
         else if (CTS == "False")
         {
            rbchqtype2.Checked = true;
         }
         txtAcntno.Text = dgvwDtls.Rows[e.RowIndex].Cells["Accountno"].Value.ToString();
         cmbAcntype.Text = dgvwDtls.Rows[e.RowIndex].Cells["Accounttype"].Value.ToString();
         Isinsert = false;
      }
      else if (dgvwDtls.Columns[e.ColumnIndex].Name == "Delete")
      {
         bnkid = Convert.ToInt32(dgvwDtls.Rows[e.RowIndex].Cells["bankid"].Value);
         DialogResult dr = MessageBox.Show("Are you sure to delete row?", "Confirmation", MessageBoxButtons.YesNo);
         if (dr == DialogResult.Yes)
         {
            bnkinfo.DeleteData(bnkid);
         }
         else if (DialogResult == DialogResult.No)
         {
            MessageBox.Show("Nothing Deleted");
         }
         LoadDataGridView();
      }
   }
}

Если вы разместите тест RowIndex в начале, вы получите ранний выход метода. Однако странно, что событие CellContentClick срабатывает при нажатии на заголовок столбца.


Member 13153537

Спасибо.

Рейтинг:
14

RickZeeland

Проверять:

e.RowIndex >= 0
Вы можете использовать .SortMode свойство для столбцов см.:
Как установить режимы сортировки столбцов в элементе управления Windows Forms DataGridView[^]
Также видеть: сортировка datagridview по заголовку столбца нажмите кнопку[^]


Member 13153537

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