Эффективно обновлять DataGridView после обновления строки

#c# #datagridview #bindingsource #tableadapter

#c# #datagridview #bindingsource #tableadapter

Вопрос:

У меня есть DataGridView, который получает данные с SQL Server с помощью a TableAdapter и a BindingSource .

У меня есть метод, который обнаруживает изменения в строках и отправляет запрос на обновление на SQL Server. Это работает отлично.

После этого, чтобы обновить DataGridView, я делаю следующее:

 this.TableAdapter.Fill(this.DataSet.DataTable);
  

Проблема в том, что это занимает много времени из-за количества строк.

Мне нужно обновить его, потому что адаптер таблицы — это представление, которое объединяет две таблицы с помощью левого соединения.

Есть ли способ обновить только одну строку или другой более быстрый способ обновить представление?

Комментарии:

1. При использовании DataAdapter Существует связь между DataTable / DataSet и базой данных. Таким образом, вы можете использовать ds. AcceptChanges() (или dt. AcceptChanges(). Для обновления данных в базе данных. После изменения DataSet / DataTable DGV автоматически не обновляется, поэтому хитрость заключается в том, чтобы установить для источника данных значение null и вернуться к DataTable: datagridview1.DataSource = null; datagridview1.DataSource = dt;

2. Я пробовал « DataGridView.DataSource = null; DataGridView.DataSource = this. DataSet; « но это не обновляет данные

3. Вы записывали в DataTable, а затем выполняли AcceptChanges? Смотрите : learn.microsoft.com/en-us/dotnet/api /…

Ответ №1:

Сделайте еще один запрос к адаптеру таблицы (щелкните его правой кнопкой мыши, добавьте запрос), который принимает параметр данных для выборки. Например, если у вас есть существующий запрос:

 SELECT * FROM a LEFT JOIN b ON a.id = b.id
  

(примечание; как правило, очень плохая идея писать запросы в tableadapter a, которые загружают все содержимое базы данных в клиент)

Вы можете добавить еще один запрос к адаптеру таблицы:

 SELECT * FROM a LEFT JOIN b ON a.id = b.id WHERE a.id = @aid
  

И назовите это FillByAId / GetDataByAId

Затем на стороне клиента вы можете, после обновления некоторого идентификатора строки 1234:

 var newDt = yourTableAdapter.GetDataByAId(1234);
  

А затем объедините изменения в существующую таблицу данных с помощью datatable.Слияние