Refresh DataGridView when updating data source
What is the best way to refresh a DataGridView when you update an underlying data source?
I’m updating the datasource frequently and wanted to display the outcome to the user as it happens.
I’ve got something like this (and it works), but setting the DataGridView.DataSource to null doesn’t seem like the right way.
8 Answers 8
I ran into this myself. My recommendation: If you have ownership of the datasource, don’t use a List. Use a BindingList. The BindingList has events that fire when items are added or changed, and the DataGridView will automatically update itself when these events are fired.
Well, it doesn’t get much better than that. Officially, you should use
It’s still a «clear/reset source» kind of solution, but I have yet to find anything else that would reliably refresh the DGV data source.
The cleanest, most efficient and paradigm-friendly solution in this case is to use a System.Windows.Forms.BindingSource as a proxy between your list of items (datasource) and your DataGridView :
Then, when adding items, use Add() method of BindingSource instead of your list’s Add() method:
This way you adding items to your list and notifying DataGridView about those additions with the same line of code. No need to reset DataGridView ‘s DataSource every time you make a change to the list.
It also worth mentioning that you can drop a BindingSource onto your form directly in Visual Studio’s Forms Designer and attach it as a data source to your DataGridView there as well, which saves you a line of code in the above example where I’m doing it manually.
Как обновить datagridview c
![]()
This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.
Answered by:
Question
I cant get the datagridview to update automatically after adding/updating or deleting the record. Some basic information about the program:
1)The main form with the datagridview stays open while the new form is called to add/update/delete.
2)I have tried adding datagridview1.refresh(); and datagridview1.update(); on the other forms
3)On the main form it is bound automatically in the form load as: this.employeeTableAdapter1.Fill(pdoDataSet1.employees);
Any help with this would be greatly appreciated.
I have a refresh button on the main form with the datagridview and this works to update it:
I tried taking this and adding it as another instance like this:
Then on other forms where I either add/update or delete I have the following:
Обновить DataGridView после вставки значений
Однако я не уверен, что это лучший способ обновить DataGridview, поскольку значения были вставлены после нажатия кнопки.
Вот код с рабочим решением повторной привязки источника данных, а затем он обновится:
2 ответа
В вашем коде отсутствует часть, в которой переменная carsBindingSource инициализируется данными. Из вашего ограниченного кода следует отметить, что . если вы добавляете / вставляете новую строку в таблицу в базе данных, то это НЕ будет автоматически обновлять carsBindingSource.
Неизвестно, «что» используется в качестве DataSource для carsBindingSource. ИЛИ, как заполняется этот источник данных. Я предполагаю, что DataSource для BindingSource является DataTable и что где-то в коде он получает это DataTable из запроса к базе данных. Если этого процесса еще нет в одном методе, который возвращает DataTable , то я рекомендую вам создать его, и он может выглядеть примерно так .
Выше будет возвращен DataTable с тремя (3) столбцами: Марка, Модель и Год. Этот DataTable используется как DataSource для BindingSource … carsBindingBource.
Теперь в событии button1_Click код вставляет новые значения в базу данных. Однако carsBindingSource по-прежнему будет содержать данные «до» добавления новых элементов в БД. Следовательно, мы можем просто использовать описанный выше метод для «обновления» carsBindingSource после добавления новых элементов в БД.
Примечание: здесь вы можете пойти двумя путями: 1) как описано выше, просто обновить «все» данные в источнике привязки… ИЛИ… 2) после обновления новых элементов в базе данных, вы также можете добавить новые элементы в источник данных привязки… т.е. его DataTable . Любой из способов будет работать, и я не думаю, что один способ предпочтительнее другого, если не будет большого количества данных.
Ниже показано то, что описано выше. Обратите внимание: закомментированный код добавляет новые элементы непосредственно в DataTable. . Вы можете использовать любой из них, но не оба сразу.
Собираем все вместе…
Надеюсь, это имеет смысл.
Я не думаю, что это возможно. Возможно, вам потребуется создать отдельную кнопку для отправки, а затем обновить данные
Как я могу обновить c # dataGridView после обновления?
У меня есть dataGridView, когда я нажимаю на любую строку, открывается форма для обновления данных строки, но после завершения обновлений форма обновления закрывается, но данные dataGridView не обновляются
Как я могу это сделать ?
Обновить (); это обновление графики, а не данных, я совершил ту же ошибку! Сводка: заставляет элемент управления аннулировать свою клиентскую область и немедленно перерисовывать себя и все дочерние элементы управления. — Coops
@amer: Примите некоторые ответы на свои вопросы . — Ian
9 ответы
BindingSource — единственный способ обойтись без стороннего ORM, поначалу это может показаться долгим, но преимущества одного метода обновления на BindingSource так полезны.
Если ваш источник, например, список пользовательских строк
затем, когда вы закончите редактирование, просто обновите свой объект данных, будь то DataTable или Список пользовательских строк, таких как здесь и ResetBindings на BindingSource ;

хм, исходя из «простого вопроса об обновлении DataGridView», этот вызов ResetBinding () по-прежнему не работает с моим простым тестовым проектом;) Можете ли вы привести реальный, готовый к сборке рабочий пример правильного выполнения обновления? — Алан
ResetBindings, похоже, работает только с типами .net. Я думаю, что если вы используете настраиваемую коллекцию, вам необходимо реализовать интерфейс IBindingList, но я еще не пробовал этого. — Эд Сайкс
Что вы имеете в виду под индивидуальной коллекцией? — Курятники
Не пробовал на @EdSykes IBindingList предложение, но это не работать с BindingList<T> либо к сожалению. — Тоби
Повторно привяжите свой DatagridView к источнику.
ответ дан 10 авг.
Это всего лишь пример, вам нужны только две нижние строки, и вы захотите их после обновления. Итак, представьте себе родителя, дочернее событие закрытия. — Ian
Вот как я это делал, и он отлично работает, но я обнаружил, что «BindingSource» с этим единственным методом «ResetBindings» (согласно моему ответу) превосходно! — Курятники
@Ian: возможно, стоит обновить ваш пример и упомянуть, что если обнулить свойство DataSource, они потеряют схему (столбцы). Обычно лучше установить для него typeof (ElementType), где ElementType — это тип связанных строк. — Алан
хотя он работает, но вам нужно сбросить некоторые свойства вашего datagridview, такие как текст заголовка столбца, размер столбца и видимость некоторого столбца, такого как id и . — Вахид Гадири
Я знаю, что опаздываю на вечеринку, но надеюсь, что это поможет кому-то, кто сделает то же самое с привязкой классов

Я знаю, что это старая тема, но я внезапно нашел лучший способ сделать это, и это не требует отмены источника данных и его переназначения. Просто используйте BindingList вместо списка.
ответ дан 30 окт ’19, 10:10
таким образом он не прокручивается вверх каждый раз, когда добавляется новый элемент — Нгуен Вьет Куонг
Я использую DataGridView Invalidate() функция. Однако это обновит весь DataGridView. Если вы хотите обновить определенную строку, вы используете dgv.InvalidateRow(rowIndex) . Если вы хотите обновить определенную ячейку, вы можете использовать dgv.InvalidateCell(columnIndex, rowIndex) . Это, конечно, при условии, что вы используете источник привязки или источник данных.
ответ дан 17 дек ’20, 18:12
Я не знаю, действительно ли это решено или нет . но, глядя на все остальные ответы, ничего не кажется достаточно ясным. Лучший способ, который я нашел для этого, — это поместить тот же код, который использовался для заполнения вашего datagridview в метод и передайте ему форму datagridview , как так:
Код внутри метода точно такой же, как код, используемый для заполнения datagirdview изначально, за исключением datagridview изменение имени на то, что вы назвали в своем методе.
Теперь этот метод вызывается в вашей родительской форме.
Дочерняя форма запускается через .ShowDialog() затем метод вызывается после, так что он вызывается сразу после закрытия дочернего элемента for . так:
ответ дан 24 мар ’16, в 21:03
Вы можете использовать метод обновления DataGridView. Но . во многих случаях вам нужно обновить DataGridView из методов, работающих в другом потоке, чем тот, в котором запущен DataGridView. Для этого вы должны реализовать следующий метод и вызвать его, а не напрямую набирать DataGridView.Refresh ():

Вам просто нужно переопределить Источник данных. Итак, если у вас есть, например, DataGridView DataSource, который содержит a, b, ic:
И вдруг вы обновляете DataSource, так что у вас есть только a и b, вам нужно будет переопределить свой DataSource:
Я надеюсь, вы найдете это полезным.
ответ дан 16 дек ’14, 13:12
Вы можете использовать SqlDataAdapter для обновления DataGridView
ответ дан 01 апр.
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c# datagridview or задайте свой вопрос.