Мне нужно удалить выбранную строку из таблицы данных - PullRequest
0 голосов
/ 09 июля 2019

Я хочу удалить выбранную строку в DataGridView из базы данных, но получаю другой индекс.Любые предложения, где я делаю что-то не так?enter image description here

private void Button3_Click(object sender, EventArgs e)
{
    foreach (DataGridViewCell oneCell in dataGridView1.SelectedCells)
    {
        if (oneCell.Selected)
        {
            dataGridView1.Rows.RemoveAt(oneCell.RowIndex);
            string deleteQuery = $"DELETE FROM {comboBox1.SelectedItem} WHERE id= " + oneCell.RowIndex;
            form1.conn = new SqlConnection($"Server = {form1.ServerBox.Text }; Database = { form1.DBBox.Text}; Trusted_Connection = True");
            form1.cmd = new SqlCommand(deleteQuery, form1.conn);
            form1.conn.Open();
            form1.cmd.ExecuteNonQuery();
            form1.conn.Close();
        }
    }
}

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Я думаю, что ваш подход неверен, так как вы перебираете выбранные ячейки. Что произойдет, если вы выберете более одной ячейки подряд. Вы удалите эту строку дважды?

Я предлагаю следующее:

private void Button3_Click(object sender, EventArgs e)
{
    var selectedRows = dataGridView1.SelectedRows.Cast<DataGridViewRow>().ToArray();
    for (int i = 0; i < selectedRows.Length; i++)
    {
        if(selectedRows[i].Cells[idColumn.Index].Value is int id)
        {
            string deleteQuery = $"DELETE FROM {comboBox1.SelectedItem} WHERE id= " + id;
            form1.conn = new SqlConnection($"Server = {form1.ServerBox.Text }; Database = { form1.DBBox.Text}; Trusted_Connection = True");
            form1.cmd = new SqlCommand(deleteQuery, form1.conn);
            form1.conn.Open();
            form1.cmd.ExecuteNonQuery();
            form1.conn.Close();
            dataGridView1.Rows.Remove(selectedRows[i]);
        }
    }
}
0 голосов
/ 09 июля 2019

Я почти уверен, что проблема связана с вашим

dataGridView1.Rows.RemoveAt(oneCell.RowIndex);

Здесь вы, кажется, удаляете строку из DataGridView.Поэтому, когда вы пытаетесь получить индекс из ячейки с oneCell.RowIndex, он больше не находится ни в одной строке, которая является частью DataGridView => RowIndex -1

Попробуйте удалить row изDataGridView после попытки доступа к индексу:

private void Button3_Click(object sender, EventArgs e)
{
    foreach (DataGridViewCell oneCell in dataGridView1.SelectedCells)
    {
        if (oneCell.Selected)
        {
            string deleteQuery = $"DELETE FROM {comboBox1.SelectedItem} WHERE id= " + oneCell.RowIndex;
            form1.conn = new SqlConnection($"Server = {form1.ServerBox.Text }; Database = { form1.DBBox.Text}; Trusted_Connection = True");
            form1.cmd = new SqlCommand(deleteQuery, form1.conn);
            form1.conn.Open();
            form1.cmd.ExecuteNonQuery();
            form1.conn.Close();

            dataGridView1.Rows.RemoveAt(oneCell.RowIndex);
        }
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...