Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/40: Рейтинг темы: голосов - 40, средняя оценка - 4.88
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614

Добавление строки в DataGridView через BindingNavigator

02.02.2017, 09:14. Показов 7441. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. У меня сейчас голова взорвется от этого C#'па!! Это ужас какой-то. Не могу сделать элементарную вещь. Помогите пожалуйста, я внатуре уже без сил после двух ночей

У меня 2 проблемы. И я никак не могу их решить...
Проблема №1:
Есть DataGridView, BindingSource, BindingNavigator, DataSet и ToolStripButton. Короче все по стандарту, не буду приводить все контролы сюда, чтобы не засорять конкретную задачу.

Ну собственно DataSet хранит таблицу, привязан к BindingSource, который непосредственно привязан к DataGridView, для отображении этой таблицы в нем.
BindingNavigator нужен для манипулирования строками, и как раз ToolStripButton является кнопка добавления строки в DataGridView, а из него уже в DataSet. Все отлично работает, при нажатии на ToolStripButton появляется новая строка в DataGridView и я могу ее изменять.

Но проблема в том, что я не хочу ее изменять прямо в DataGridView, я хочу при нажатии на эту кнопку сделать форму, где будут textBox'ы, и через них уже добавить строку.

Делаю так для осуществлении идеи:
C#
1
2
3
4
5
6
7
8
9
10
CommonData.localDBDataSet.Data.TableNewRow += (s, e) =>
{
            var addRowToDataForm = new AddRowToDataForm();
            if (addRowToDataForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                e.Row["id"] = Guid.NewGuid();
                e.Row["name"] = addRowToDataForm.name;
                e.Row["count"] = Math.Round(addRowToDataForm.count, 3);
            }
};
Все прекрасно работает - при нажатии на ToolStripButton, создается форма, заполняю textBox'ы, нажимаю ОК, и строка создается в DataGridView.

Но как я понял из двух неспавших ночей, добавленная строка является еще на стадии модификации, и поэтому при закрытии программы и открытии заново, она не записывается в базу данных!

Да...я забыл сказать, запись в базу у меня происходит при закрытии формы.

Так вот, я понял, что мне нужно как-то при добавлении строки сразу проходить валидацию строки. Делаю так:
C#
1
2
3
4
5
            this.dataDataGridView.RowValidated += (s, e) =>
            {
                this.Validate();
                this.dataBindingSource.EndEdit();
            };
Но почему-то в этот обработчик я попадаю только тогда, когда в DataGridView больше 1 строки уже. Бред вообще. Тоесть если в DataGridView не строк вообще, и я добавляю новую, то в этот обработчик я не попадаю. Как только я еще одну добавляю, то попадаю в этот обработчик. Я уже с ума схожу...

Проблема № 2:
Все те же контролы и формы, как и в первой проблеме, только теперь продолжим нашу идею.
При нажатии кнопки добавления строки, возникает форма с textBox'ами и двумя кнопками - Ок и Отмена.
Так что же будет если я нажму на Отмена?
А я Вам скажу что будет - строка все равно добавится в DataGridView, но пустая, и возникнет исключение, так как столбец id должен быть не null. Тоесть мне нужно, как то отменять операцию добавления строки здесь:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CommonData.localDBDataSet.Data.TableNewRow += (s, e) =>
{
            var addRowToDataForm = new AddRowToDataForm();
            if (addRowToDataForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                e.Row["id"] = Guid.NewGuid();
                e.Row["name"] = addRowToDataForm.name;
                e.Row["count"] = Math.Round(addRowToDataForm.count, 3);
            }
            else
            {
                // Здесь отмена
            }
};
Как сделать - не понимаю

Ребят, я очень надеюсь на Вашу поддержу и помощь...
Это уже не серьезно работать две ночи над таким бредом...
Помогите пожалуйста
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.02.2017, 09:14
Ответы с готовыми решениями:

Bindingnavigator и datagridview
Есть локальная БД с двумя таблицами: Studenti и Prepodavateli. На форме 1 bindingnavigator и 2 datagridview. Навигатор связан с первой...

BindingNavigator и DataGridView
Не могу корректно заполнить базу через стандартные средства добавления в bindingNavigator. Необходимо добавить строку с ячейкой c типом...

Связать dataGridView и bindingNavigator
Ребят, есть такая проблема: У меня есть 2 компонента: dataGridView и bindingnavigator. Но стандартные кнопки (те что с левой...

10
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
02.02.2017, 13:33
Цитата Сообщение от Bretbas Посмотреть сообщение
Проблема №1:
Строка добавляется в источник данных, а валидация происходит в гриде. Отсюда и проблема.
По умолчанию проверка в гриде происходит после того, как измененная строка теряет фокус. Это можно решить, установив CurrentCell в null, но правильнее будет сделать проверку в форме редактирования, чтобы пользователь не терял все введенные данные,а мог исправить ошибку.
Цитата Сообщение от Bretbas Посмотреть сообщение
Проблема № 2:
На кнопке Ок ставите DialogResult в DialogResult.OK. На кнопке Отмена DialogResult.Cancel. И тогда при нажатии отмены
условие
C#
1
if (addRowToDataForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
вернет false.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
03.02.2017, 08:08  [ТС]
Igr_ok,
Цитата Сообщение от Igr_ok Посмотреть сообщение
Строка добавляется в источник данных, а валидация происходит в гриде. Отсюда и проблема.
По умолчанию проверка в гриде происходит после того, как измененная строка теряет фокус. Это можно решить, установив CurrentCell в null, но правильнее будет сделать проверку в форме редактирования, чтобы пользователь не терял все введенные данные,а мог исправить ошибку.
Я Вас прекрасно понимаю, НО Вы понимаете что на обработчик валидации вообще не хочет идти, если в DataGridView не было строк, и я добавляю первую. Код:
C#
1
2
3
4
5
            this.dataDataGridView.RowValidated += (s, e) =>
            {
                this.Validate();
                this.dataBindingSource.EndEdit();
            };
Проходит только в том случае, если в DataGridView уже есть строки и я добавляю новую. Вот тогда этот обработчик выполняется и соответственно так как я пишу this.dataBindingSource.EndEdit(), то выполняется завершение проверки строки и при закрытии программы она добавляется в базу.

Бред в том, что этот обработчик не выполняется если в DataGridView нет строк и я добавляю.

Цитата Сообщение от Igr_ok Посмотреть сообщение
На кнопке Ок ставите DialogResult в DialogResult.OK. На кнопке Отмена DialogResult.Cancel. И тогда при нажатии отмены
условие
Это я тоже знаю, но у меня кнопка добавления строки ToolStripButton привязана к свойству AddNewItem объекта BindingNavigator. И поэтому при любых раскладах, если ты нажмешь на эту кнопку, она добавит строку в DataGridView

Добавлено через 11 часов 52 минуты
Короче я так понял эти две проблемы нерешаемые, если я хочу использователь привязку ToolStripButton к свойству AddNewItem объекта BindingNavigator, так как тогда ToolStripButton будет добавлять строку в DataGridView в любом случае, и это действие нельзя отменить.

Во-первых, я отвязал ToolStripButton от BindingNavigator.
Во-вторых, я завел переменную indexCurrentRow, которая следит за текущей строкой в DataGridView.
Изменяется она в этом обработчике:
C#
1
2
3
4
5
this.dataDataGridView.RowsAdded += (s, e) =>
{
    // Фиксируем индекс новой строки
    indexCurrentRow = e.RowIndex;
};
Написал обработчик добавления строки:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
this.addNewToolStripButton.Click += (s, e) =>
{
    var addRowToDataForm = new AddRowToDataForm();
    if (addRowToDataForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        // Создаем новую строку и заполняем ее
        DataRow newDataRow = CommonData.localDBDataSet.Data.NewRow();
        newDataRow["id"] = Guid.NewGuid();
        newDataRow["name"] = addRowToDataForm.name;
        newDataRow["count"] = Math.Round(addRowToDataForm.count, 3);
 
        // Добавляем новую строку в таблицу Data
        CommonData.localDBDataSet.Data.Rows.Add(newDataRow);
    }
    
    // Теперь эта добавленная строка является текущей
    this.dataDataGridView.CurrentCell = this.dataDataGridView.Rows[indexCurrentRow].Cells.OfType<DataGridViewCell>().First(c => c.Visible);
};
Вроде все. Теперь все работает - и в базу данных фиксируется новая строка, и отмену в форме можно нажать.
0
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
07.02.2017, 03:52
C#
1
2
3
4
5
6
7
8
9
10
11
var addRowToDataForm = new AddRowToDataForm();
            if (addRowToDataForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                e.Row["id"] = Guid.NewGuid();
                e.Row["name"] = addRowToDataForm.name;
                e.Row["count"] = Math.Round(addRowToDataForm.count, 3);
            }
            else
            {
                bindingSource1.CancelEdit();
            }
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
07.02.2017, 08:09  [ТС]
Aferuga, нет так не будет работать, если кнопка ToolStripButton привязана к BindingNavigator через свойство AddNewItem
0
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
07.02.2017, 10:34
Извините, не так понял
C#
1
2
3
4
5
6
7
8
9
10
var addRowToDataForm = new AddRowToDataForm();
            if (addRowToDataForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                //добавляет новую строку для заполнения
                bindingsource1.AddNew();
                e.Row["id"] = Guid.NewGuid();
                e.Row["name"] = addRowToDataForm.name;
                e.Row["count"] = Math.Round(addRowToDataForm.count, 3);
                
            }
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
09.02.2017, 17:06  [ТС]
Aferuga, хм..а вот надо поглядеть

Добавлено через 19 минут
Aferuga, кстати, с Вашим кодом мне придется отвязывать ToolStripButton от BindingNavigator, и тогда понта от этого нет. Ваш код такой же как и мой получается

Добавлено через 10 минут
Да, и Вы не написали обработчик, где этот код:
C#
1
2
3
4
5
6
7
8
9
10
var addRowToDataForm = new AddRowToDataForm();
            if (addRowToDataForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                //добавляет новую строку для заполнения
                bindingsource1.AddNew();
                e.Row["id"] = Guid.NewGuid();
                e.Row["name"] = addRowToDataForm.name;
                e.Row["count"] = Math.Round(addRowToDataForm.count, 3);
                
            }
выполнять. В Click e не имеет Row. А в TableNewRow нельзя отмену применить. Строка в любому случае добавится.
0
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
10.02.2017, 03:55
Цитата Сообщение от Bretbas Посмотреть сообщение
Вы не написали обработчик, где этот код
Там где Вы вызываете форму с добавлением новых строк
Цитата Сообщение от Bretbas Посмотреть сообщение
В Click e не имеет Row.
Это из вашего кода выше.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (addRowToDataForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                //добавляет новую строку для заполнения
                bindingsource1.AddNew();
                dataGridView1.Rows[dataGridView1.Rows.Count()-1]["id"]=Guid.NewGuid();
                dataGridView1.Rows[dataGridView1.Rows.Count()-1]["name"] = addRowToDataForm.name;
                dataGridView1.Rows[dataGridView1.Rows.Count()-1]["count"] = Math.Round(addRowToDataForm.count, 3);
                //сохранение записи если надо
                bindingsource1.EndEdit();
            }
else
{
//Отмена внесенных изменений если надо
bindingsource1.CancelEdit();
}
Цитата Сообщение от Bretbas Посмотреть сообщение
с Вашим кодом мне придется отвязывать ToolStripButton от BindingNavigator,
Я не совсем понимаю что это значит и зачем оно Вам надо?
Если хотите ещё одна кнопка вызывала форму для добавления просто укажите ей тоже самое событие OnClick
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
10.02.2017, 08:40  [ТС]
Aferuga, Е-мое. Вы меня не понимаете. Во-первых у меня вот такого в коде явно нет.
Так как вы присваиваете ячейке DataGridView значения. DataGridView - это представления данных. Запись должна происходить через DataSet
0
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
10.02.2017, 09:15
Цитата Сообщение от Bretbas Посмотреть сообщение
Запись должна происходить через DataSet
И она пройдет через связку dataGridView -> bindingSource-> DataSet
Эта связка работает не только для выгрузки данных но и для добавления/изменения
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
10.02.2017, 10:01  [ТС]
Aferuga, попробую сегодня. Если что, отпишу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.02.2017, 10:01
Помогаю со студенческими работами здесь

Как связать bindingnavigator и datagridview?
BindingSource bs1 = new BindingSource(); DataSet dataSet = new DataSet(); string mytablename =...

DatagridView+bindingNavigator, не сохраняются данные
Добрый день, не могу понять в чем проблема, почему не сохраняются изменения в датагрид, БД подключал через датагрид,навигатор соединил....

Использование BindingNavigator для нескольких Datagridview
Как использовать один BindingNavigator для управления данными в нескольких Datagridview , которые находятся в разных вкладках? К примеру,...

Один BindingNavigator для нескольких Datagridview
Как сделать управление данными в нескольких DatagridView, каждый из которых расположен на разных вкладках, при помощи одной панели...

Как использовать Datagridview, BindingSource и BindingNavigator?
Ребята, привет. Прошу помощи, написал весь код, который нужен, но не могу понять, как сделать этот пункт &quot;Для отображения полученного...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru