2015-10-16 4 views
1

Я всегда используюC# & SQL: как обновить таблицу без обновления DataGridView?

DataGridView.DataSource = (DataTable)tbl; 

Но этот метод полностью refresing в DataGridView что-то вроде selectedrows, положение полосы прокрутки, BACKCOLOR и т.д .. Я только хочу, чтобы обновить данные ячеек из SQL witouth полной DataGridView обновить

Для примера uTorrent имеет таблицу типа datagridview, а в некоторых ячейках значения x KB/s всегда обновляются, но torrentdatagrid статичен. нет движения прокрутки, нет выбора просачивания и т. д.

Помогите мне сделать это?

Прошу прощения за мой плохой английский. Благодарю.

+0

Несомненно, вы можете перебирать строки и столбцы и устанавливать новые значения. Но почему не только сохранить выбранный индекс datagridview и повторно выбрать его после установки источника данных? –

+0

#Reza Aghaei, потому что, если я это сделаю, как вы говорите, некоторые действия на экране выглядят примерно так (после обновления данных datasource :) прокрутка вверх по вершине таблицы и при повторном выборе выполнения позиции прокрутки снова меняется. Когда это происходит, пользователи видят все действия. Я, Да, это будет работать, но это плохо. –

+0

Так что, если некоторые записи удалены или добавлены в источник данных? –

ответ

1

Если таблица имеет первичный ключ, и вы хотите только обновить существующий/добавить новые строки, вы можете использовать DataTable.Merge Method так:

Первоначально

dataGridView.DataSource = initial_data_table; 

Update

((DataTable)dataGridView.DataSource).Merge(new_data_table); 

UPDATE: Метод выше прост, но, как упоминалось в комментариях, он имеет побочные эффекты из-за Merge оптимизация методов, которые подавляют уведомления об изменениях во время работы и поднимают ListChanged событие с ListChangedType.Reset в конце. Итак, вот простой и эффективный метод, который делает трюк, основанный на DataTable.LoadDataRow Method:

foreach (var dataRow in newTable.AsEnumerable()) 
    table.LoadDataRow(dataRow.ItemArray, LoadOption.OverwriteChanges); 

И образец доказательства того, что:

using System; 
using System.Data; 
using System.Linq; 
using System.Windows.Forms; 

namespace Samples 
{ 
    static class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      var form = new Form(); 
      var dg = new DataGridView { Dock = DockStyle.Fill, Parent = form }; 
      var data = GetData(); 
      dg.DataSource = data; 
      var updateTimer = new Timer { Interval = 200, Enabled = true }; 
      updateTimer.Tick += (sender, e) => 
      { 
       foreach (var dr in GetData().AsEnumerable()) 
        data.LoadDataRow(dr.ItemArray, LoadOption.OverwriteChanges); 
      }; 
      Application.Run(form); 
     } 
     static DataTable GetData() 
     { 
      var dt = new DataTable(); 
      dt.Columns.Add("Id", typeof(int)); 
      dt.Columns.Add("Name"); 
      dt.Columns.Add("Score", typeof(int)); 
      dt.PrimaryKey = new[] { dt.Columns["Id"] }; 
      var random = new Random(); 
      for (int i = 1; i <= 1000; i++) 
       dt.Rows.Add(i, "Player #" + i, random.Next(1, 100000)); 
      return dt; 
     } 
    } 
} 
+0

Сбрасывает положение прокрутки сетки и выбранную запись. он обновляет сетку. –

+0

да обновляет сетку. –

+0

@RezaAghaei Мои тесты показывают, что только горизонтальное положение прокрутки сбрасывается. Положение вертикальной прокрутки и выбранная запись не затрагиваются. –

0

Может быть, я сильный удар, чтобы объяснить проблему. Прости. но, этот код решил мою проблему,

  for (int i = 0; i < dg.Rows.Count; i++) 
      { 
       for (int j = 1; j < dg.Columns.Count ; j++) 
       { 
        dg.Rows[i].Cells[j].Value = NewDataTable.Select("ID=" + dg.Rows[i].Cells[0].Value)[0][j].ToString(); 
       } 
      } 

первый столбец ID первичный стол ключа. I m Обновление таймером и передача данных в реальном времени в мой datagridview. спасибо

+0

Это то же самое, что и мой код, вы использовали простые для петель, пока я использовал linq. –

+0

Да. Я нехорошо в Линк. Но я тоже попробовал ваш код. Я получаю результат. но Thaks Reza так много –

+0

Это решение будет иметь проблемы с столбцами readonly, также будет иметь проблемы с переупорядоченными столбцами, также будут проблемы, когда столбец таблицы отсутствует в сетке, в то время как мой пост охватывает эти проблемы. –

Смежные вопросы