Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310

Удаление строки из DataGridView не с первого раза

14.10.2021, 14:33. Показов 1742. Ответов 16

Студворк — интернет-сервис помощи студентам
Добрый день! Подскажите пожалуйста. На форме имеется 2 таблицы. Код заполнения, сохранения, удаления строк одинаковый, только название таблиц меняю. Проблема в том, что при удалении выделенной строки из грида происходит не с первого раза. Нажимаю удалить строка остается а таблица просто заново загружается в грид. Я нажимаю второй раз и строка удаляется и из грида и из базы. Как это исправить?

Загрузка в грид
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void Debtorload()
        {
            query = "SELECT * FROM dbo.Debtor";
            dbAdp = new SqlDataAdapter(query, sqlConn);
            SqlCommandBuilder cBuilder = new SqlCommandBuilder(dbAdp);
            var ds = new DataSet();
            dbAdp.Fill(ds);
            DebtDGV.DataSource = ds.Tables[0];
            DebtDGV.AutoResizeColumns();
            DebtDGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            DebtDGV.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            DebtDGV.Columns[0].Visible = false;
            DebtDGV.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
            DebtDGV.Columns[2].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            DebtDGV.Columns[1].HeaderText = "Клиент";
            DebtDGV.Columns[2].HeaderText = "Долг";
            DebtFormula();
        }
Обновление базы и грида
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void Debtorubdate()
        {
 
            dbAdp.Update(dbTable);
            query = "SELECT * FROM dbo.Debtor";
            dbAdp = new SqlDataAdapter(query, sqlConn);
            SqlCommandBuilder cBuilder = new SqlCommandBuilder(dbAdp);
            dbTable = new DataTable();
            dbAdp.Fill(dbTable);
            BindingSource bs = new BindingSource();
            bs.DataSource = dbTable;
            DebtDGV.DataSource = bs;
            DebtFormula();
        }
Удаление в гриде
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 private void DebtorDelBtn_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Удалить запись?", "Удаление записи", MessageBoxButtons.OKCancel,
                MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
            {
 
                int delet = DebtDGV.SelectedCells[0].RowIndex;
                DebtDGV.Rows.RemoveAt(delet);
                Debtorubdate();
            }
            else
            {
                try
                {
                    if (MessageBox.Show("Удалить запись?", "Удаление записи", MessageBoxButtons.OKCancel,
                    MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
                    {
                        int delet = DebtDGV.SelectedCells[0].RowIndex;
                        DebtDGV.Rows.RemoveAt(delet);
                        Debtorubdate();
                    }
                }
                catch
                {
                    MessageBox.Show("Нельзя удалить запись, т.к. она не выбрана", "Удаление записи", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
            }
        }
Все для другой таблицы одинаково только название датагрида меняю. Не удаляется с первого раза. Нужно удалить строку обновить данные в базе и гриде.
И еще вопрос. Чем отличается апдейт от загрузки? Только строкой апдейт? Или я что-то не верно написал в коде? нельзя просто написать?
C#
1
2
dbAdp.Update(dbTable);
Debtorload()
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.10.2021, 14:33
Ответы с готовыми решениями:

DataGridView выделение строки не срабатывает с первого раза
Здравствуйте! Проблема такая: нужно выделить текущую ячейку. Private Sub DataGridView2_CellMouseClick(ByVal sender As Object, ByVal...

Удаление записей с первого раза
Ребят у меня такая проблема. Я вот хочу с одной таблицы на вторую отправить все товары, и чтобы в первоначальной откуда отправляю оно...

Как запретить удаление строки в DataGridView, если пользователь не выбрал ни одной строки?
Здравствуйте! У меня есть datagridview и кнопка удаления записи на форме. Данные в datagridview попадают из таблицы базы данных...

16
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
14.10.2021, 14:42
gena8208, мутный метод
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 private void DebtorDelBtn_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Удалить запись?", "Удаление записи", MessageBoxButtons.OKCancel,
                MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
            {
 
                int delet = DebtDGV.SelectedCells[0].RowIndex;
                DebtDGV.Rows.RemoveAt(delet);
                Debtorubdate();
            }
            else
            {
                try
                {
                    if (MessageBox.Show("Удалить запись?", "Удаление записи", MessageBoxButtons.OKCancel,
                    MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
                    {
                        int delet = DebtDGV.SelectedCells[0].RowIndex;
                        DebtDGV.Rows.RemoveAt(delet);
                        Debtorubdate();
                    }
                }
                catch
                {
                    MessageBox.Show("Нельзя удалить запись, т.к. она не выбрана", "Удаление записи", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
            }
        }
0
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310
14.10.2021, 14:45  [ТС]
C#
1
2
3
4
5
6
7
8
if (dataGridView1.SelectedRows.Count > 0) {
   DataGridViewSelectedRowCollection row = dataGridView1.SelectedRows;
   
   dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);
}
else {     
   MessageBox.Show("Please select a row");
}
я и такой пробовал.
C#
1
2
3
4
foreach(DataGridViewRow row in dgv1.SelectedRows)
{
       dgv1.Rows.Remove(row);
}
и так
Может что то в загрузке таблиц. Или обновлении. Не понятно почему так происходит. Может потому что адаптеры и названия переменных одинаковое для обоих таблиц
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
14.10.2021, 14:48
gena8208, посмотрите тут пример, там вполне внятно написано adapter update
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
14.10.2021, 15:14
gena8208, Вы пытаетесь вносить изменения в таблицу БД через грид, вероятно, слабо представляя какие "чудеса" ждут Вас Например, юзер ввел нецифру в числовое поле или не ввел обязательное - будет exception, который придется обрабатывать, проверяя все поля. Есть еще и другие "радости" связанные с коллизиями, неизбежно возникающие при многопользовательской работе.
Как надо делать:
1. Использовать модель. Извлекаем набор данных из таблицы, обертываем его в List<Модель> и просто суем его в grid.DataSource, колонки которые можно настроить все в той же модели соответствующими директивами (выравнивание и прочее). Грид используется только для просмотра.
2. Для правки и добавления - модальные формочки, где юзер может ввести нужные данные. По нажатию "сохранить" данные проверяются на валидность и при ошибке возле соответствующего поля надпись "ошибка". Если все ок, то данные с формы кладутся в модель и она передается в методы репозитория (специальный класс в папке Model проекта рядом с файлом класса модели). В методах формируется запрос к БД с подстановкой в параметры данных из пришедшей модели. Если все ок, то модальная форма закрывается, нд в гриде перечитывается и в нем по id ищется активная запись (измененная или добавленная).
Точно так же и с удалением, только модальная форма как таковая не нужна, а нужно диалоговое стандартное окно для подтверждения. При этом после перечитки нд ищется ближайшая соседняя по отношению к удаленной запись, id которой перед удалением запоминается в переменной.

Добавлено через 2 минуты
Забыл добавить - извлечение нд из базы ("перечитка") также в методе репозитория. Т.е. основной код приложения не должен напрямую обращаться к БД от слова совсем - только через репозиторий !
1
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310
14.10.2021, 15:47  [ТС]
юзверь вводит данные через текстбоксы. Валидность ввода можно и там проверить. Работает с косяками но свою задачу выполняет. Каждый день меняю, добавляю код. Что то новое вношу. Учусь. Грид заметно тормозит от заполнениями полных данных. Постепенное заполнение пока не освоил. 1000 строк уже притормаживает. Но пока обошелся тем что убираю прорисовку строк. Значительно быстрее. Но нет ли возможности на данном этапе решить проблему? Со временем ведь можно и переделать программу. База то остается. А интерфейс осваиваю понемногу. Понятно что перелопачивать много. Но все знать невозможно. Постепенно переделаю через listview
Миниатюры
Удаление строки из DataGridView не с первого раза  
0
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310
14.10.2021, 15:54  [ТС]
Вот как уже в новом виде это окно
Миниатюры
Удаление строки из DataGridView не с первого раза  
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
14.10.2021, 17:17
gena8208, так вам и написали как лучше переделать. Создать модели (модель представляет единичную запись в талице), написать свои запросы для работы с бд. И вынести логику из формы.

В коде не видно, но сначала удалили строку из DataTable, потом ее (таблицу) передали в адаптер Update, и после вызвали у этой таблицы AcceptChanges. Вроде, так они работают.
C#
1
2
3
dataTable.Rows.Remove....
dataAdapter.Update(dataTable)
dataTable.AcceptChanges()
1
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
14.10.2021, 19:24
ipsorokin, нет смысла вызывать dataTable.AcceptChanges() после dataAdapter.Update(dataTable), потому что это делается в методе Update, только построчно(DataRow.AcceptChanges).
0
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310
15.10.2021, 09:22  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
В коде не видно, но сначала удалили строку из DataTable, потом ее (таблицу) передали в адаптер Update, и после вызвали у этой таблицы AcceptChanges. Вроде, так они работают.
C#Выделить код
dataTable.Rows.Remove....
dataAdapter.Update(dataTable)
dataTable.AcceptChanges()
Цитата Сообщение от Igr_ok Посмотреть сообщение
ipsorokin, нет смысла вызывать dataTable.AcceptChanges() после dataAdapter.Update(dataTable), потому что это делается в методе Update, только построчно(DataRow.AcceptChanges).
Господа, я не знаю с чем это связано. Не поленился вчера. Создал новый проект. Кинул на форму два грида и скопировал код загрузки в грид и удаления через кнопку из предыдущей программы. Без PageTab строка удаляется с первого раза.

Добавлено через 7 минут
Цитата Сообщение от Igr_ok Посмотреть сообщение
ipsorokin, нет смысла вызывать dataTable.AcceptChanges() после dataAdapter.Update(dataTable), потому что это делается в методе Update, только построчно(DataRow.AcceptChanges).
Цитата Сообщение от ipsorokin Посмотреть сообщение
gena8208, так вам и написали как лучше переделать. Создать модели (модель представляет единичную запись в талице), написать свои запросы для работы с бд. И вынести логику из формы.
В коде не видно, но сначала удалили строку из DataTable, потом ее (таблицу) передали в адаптер Update, и после вызвали у этой таблицы AcceptChanges. Вроде, так они работают.
C#Выделить код
1
2
3
dataTable.Rows.Remove....
dataAdapter.Update(dataTable)
dataTable.AcceptChanges()
quote="ipsorokin;15771343"]В коде не видно, но сначала удалили строку из DataTable, потом ее (таблицу) передали в адаптер Update, и после вызвали у этой таблицы AcceptChanges. Вроде, так они работают.
C#Выделить код
dataTable.Rows.Remove....
dataAdapter.Update(dataTable)
dataTable.AcceptChanges()[/quote]

Господа, я не знаю с чем это связано. Не поленился вчера. Создал новый проект. Кинул на форму два грида и скопировал код загрузки в грид и удаления через кнопку из предыдущей программы. Без PageTab строка удаляется с первого раза. Может как то не верно или не туда пихаю загрузку в грид. То я ее при инициализации пихал, потом в формлоад. Может программа не видит что активен первый лист. Хотя при отладке он показывает номер выделенной строки и проходит код удаления, но строка остается и при повторном нажатии удаления строка удаляется и из грида и базы
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
15.10.2021, 12:10
Цитата Сообщение от gena8208 Посмотреть сообщение
Хотя при отладке он показывает номер выделенной строки и проходит код удаления, но строка остается и при повторном нажатии удаления строка удаляется и из грида и базы
Очевидно, что перечитка после первого удаления не делается. Второе удаление в базе просто не выполняется (удаляемой записи уже нет в таблице), но и эксепшена нет, зато датасет перечитывается. Ошибка в 17-й строке
1
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310
15.10.2021, 13:46  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Ошибка в 17-й строке
эмм
А где в 17 строке?
C#
1
int delet = DebtDGV.SelectedCells[0].RowIndex;
в ней?
В целом код то рабочий на чистой форме без Tabpage или не верно я написал код? В лист я тоже пытался загрузить данные из примера
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 private void LoadData()
        {
            string connectString = ***************
 
            SqlConnection myConnection = new SqlConnection(connectString);
 
            myConnection.Open();
 
            string query = "SELECT * FROM dbo.Kassa";
 
            SqlCommand command = new SqlCommand(query, myConnection);
 
            SqlDataReader reader = command.ExecuteReader();
 
            List<string[]> data = new List<string[]>();
 
            while (reader.Read())
            {
                data.Add(new string[14]);
 
                data[data.Count - 1][0] = reader[0].ToString();
                data[data.Count - 1][1] = reader[1].ToString();
                data[data.Count - 1][2] = reader[2].ToString();
                data[data.Count - 1][3] = reader[3].ToString();
                data[data.Count - 1][4] = reader[4].ToString();
                data[data.Count - 1][5] = reader[5].ToString();
                data[data.Count - 1][6] = reader[6].ToString();
                data[data.Count - 1][7] = reader[7].ToString();
                data[data.Count - 1][8] = reader[8].ToString();
                data[data.Count - 1][9] = reader[9].ToString();
                data[data.Count - 1][10] = reader[10].ToString();
                data[data.Count - 1][11] = reader[11].ToString();
               data[data.Count - 1][12] = reader[12].ToString();
                data[data.Count - 1][13] = reader[13].ToString();
             data[data.Count - 1][14] = reader[14].ToString();
            //    data[data.Count - 1][15] = reader[15].ToString();
            //    data[data.Count - 1][16] = reader[16].ToString();
            }
reader.Close();
 
            myConnection.Close();
 
            foreach (string[] s in data)
                KassaDGV.Rows.Add(s);
у меня 14 столбцов. Но появляется ошибка то индекс за пределами то создайте сначала столбцы или столбцы нужно указывать определенного типа?
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
15.10.2021, 14:00
Цитата Сообщение от gena8208 Посмотреть сообщение
то индекс за пределами
нахрена индекс, когда можно обращаться по названию столбца самого?

Добавлено через 58 секунд
и опять же, говорили так не делать, а создавать модели
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                data[data.Count - 1][0] = reader[0].ToString();
                data[data.Count - 1][1] = reader[1].ToString();
                data[data.Count - 1][2] = reader[2].ToString();
                data[data.Count - 1][3] = reader[3].ToString();
                data[data.Count - 1][4] = reader[4].ToString();
                data[data.Count - 1][5] = reader[5].ToString();
                data[data.Count - 1][6] = reader[6].ToString();
                data[data.Count - 1][7] = reader[7].ToString();
                data[data.Count - 1][8] = reader[8].ToString();
                data[data.Count - 1][9] = reader[9].ToString();
                data[data.Count - 1][10] = reader[10].ToString();
                data[data.Count - 1][11] = reader[11].ToString();
               data[data.Count - 1][12] = reader[12].ToString();
                data[data.Count - 1][13] = reader[13].ToString();
             data[data.Count - 1][14] = reader[14].ToString();
0
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310
15.10.2021, 14:27  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
нахрена индекс
Это отладчик пишет что индекс за пределами если я указываю большее количество столбцов чем есть или говорит что создайте столбцы если число меньше указываю. А так видимых 13 и 1 скрытый
Цитата Сообщение от ipsorokin Посмотреть сообщение
и опять же, говорили так не делать, а создавать модели
А есть пример или где почитать про создание чтобы доступным языком было написано?
Я часто смотрю примеры на Metanit а в docs.microsoft.com хрен че поймешь
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
15.10.2021, 14:33
Цитата Сообщение от gena8208 Посмотреть сообщение
А есть пример
https://www.cyberforum.ru/ado-... st15763343
1
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
15.10.2021, 15:07
Цитата Сообщение от gena8208 Посмотреть сообщение
эмм
А где в 17 строке?
Это такой древний программистский эвфемизм - когда неизвестен код, но в нем явная ошибка
Цитата Сообщение от gena8208 Посмотреть сообщение
А есть пример
Примеров на этом форуме чуть больше, чем дофига - нужно просто поискать.
1
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310
15.10.2021, 15:16  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Это такой древний программистский эвфемизм - когда неизвестен код, но в нем явная ошибка
Ясно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.10.2021, 15:16
Помогаю со студенческими работами здесь

Удаление строки из DataGridView
помогите пожалуйста сделать кнопку удаления строки из datagridview который подключенный к базе данных sql server

Удаление строки из DataGridView
всем привет :) есть дгв, пара кнопок, текстбоксы, задача - удаление строки из дгв код if (textBox1.TextLength == 0 ||...

Удаление строки в DataGridView и в БД
Всем привет. Подскажите пожалуйста, как можно удалить выбранную строку в DataGridView и в БД? БД у меня в SQL Servere. Пожалуйста, помогите...

Удаление Строки из DataGridView
Проблема заключается в следующем я написал код но он почему-то удаляет только первую строку при попытке удаления второй третей и тд...

Удаление строки из DataGridView и БД
Не судите строго. Ведь я только учусь и многое не понимаю. На форме расположен tabControl. На каждой вкладке своя таблица. Проблема в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru