Обновление данных в DataGridView элегантно - PullRequest
3 голосов
/ 30 июня 2011

У меня есть DataGridView в форме Windows, и эта сетка содержит данные, близкие к данным в реальном времени - я хочу, чтобы они обновлялись как минимум каждые 20 секунд. Моя сетка привязана к DataTable, который я генерирую программно, поэтому в настоящее время у меня есть таймер, который генерирует этот DataTable и назначает его сетке каждые 20 секунд.

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

Ответы [ 4 ]

2 голосов
/ 30 июня 2011

Примерное руководство по восстановлению порядка сортировки и выбора строки.

Сделайте это до обновления:

// Store the sort details.
ListSortDirection oldSortOrder;
switch (uiGrid.SortOrder)
{
    case SortOrder.Ascending:
        oldSortOrder = ListSortDirection.Ascending;
        break;
    case SortOrder.Descending:
        oldSortOrder = ListSortDirection.Descending;
        break;
    default:
        oldSortOrder = ListSortDirection.Ascending;
        break;
}

DataGridViewColumn oldSortColumn = uiGrid.SortedColumn;

// Store the selected rows
List<String> selectedRows = new List<String>();
foreach (DataGridViewRow row in uiGrid.SelectedRows)
{
    selectedRows.Add(row.Cells["SomeIndexColumn"].Value.ToString());
}

Сделайте это после обновления:

// Restore the sort
uiGrid.Sort(oldSortColumn, oldSortOrder);

// Restore Selected rows
foreach (DataGridViewRow row in uiGrid.SelectedRows)
{

    if (selectedRows.Contains(row.Cells["SomeIndexColumn"].Value.ToString()))
    {
        row.Selected = true;
    }
}
1 голос
/ 30 июня 2011

Вам нужно сохранить выбранные параметры, а затем перезагрузить данные и повторно применить сохраненные варианты.

На самом деле это довольно простой процесс, но я не пишу код в Winforms, чтобы привести полный пример,процедура будет похожа на

Цикл через DataGridViewItems.Сохраните индекс и / или ключ и критерии выбора.

Перезагрузите данные.

Выполните цикл по DataGridViewItems.Получить сохраненные критерии выбора, где индекс / ключ совпадают, и применить.

0 голосов
/ 26 марта 2015

Мне нравится ответ от Мартина. Однако после обновления источника данных я обнаружил, что переменная oldSortColumn каким-то образом изменяется, и представление таблицы данных не принимает его в «uiGrid.Sort (oldSortColumn, oldSortOrder)». Кроме того, uiGrid.Sort не любит oldSortColumn как ноль. Я ценю, если кто-нибудь может сообщить мне, почему oldSortColumn изменяется. Я решил использовать индекс столбца сортировки, а не сам столбец сортировки. Поэтому вот моя слегка измененная версия:

Сделайте это до обновления:

public static void GetDataGridViewUIInfo(this DataGridView dgv, out List<int> selectedIndices,
  out int? sortColumnIndex, out ListSortDirection sortOrder)
{
  selectedIndices = dgv.GetSelectedRowIndices();
  dgv.GetSortInfo(out sortColumnIndex, out sortOrder);
}

static List<int> GetSelectedRowIndices(this DataGridView dgv)
{
  List<int> selectedIndices = new List<int>();

  foreach (DataGridViewRow row in dgv.SelectedRows)
  {
    selectedIndices.Add(row.Index);
  }

  return selectedIndices;
}

static void GetSortInfo(this DataGridView dgv, out int? sortColumnIndex, out ListSortDirection sortOrder)
{
  // Store the sort details
  switch (dgv.SortOrder)
  {
    case SortOrder.Ascending:
      sortOrder = ListSortDirection.Ascending;
      break;
    case SortOrder.Descending:
      sortOrder = ListSortDirection.Descending;
      break;
    default:
      sortOrder = ListSortDirection.Ascending;
      break;
  }

  sortColumnIndex = dgv.SortedColumn == null ? null : (int?)dgv.SortedColumn.Index;
}

Сделайте это после обновления:

public static void SetDataGridViewUIInfo(this DataGridView dgv, List<int> selectedIndices,
  int? sortColumnIndex, ListSortDirection sortOrder)
{
  dgv.SetSelectedRowIndices(selectedIndices);
  dgv.SetSortInfo(sortColumnIndex, sortOrder);
}

static void SetSelectedRowIndices(this DataGridView dgv, List<int> selectedIndices)
{
  if (dgv.Rows.Count <= 0)
    // Early out if there is no row in the data grid view
    return;

  foreach (DataGridViewRow row in dgv.Rows)
  {
    row.Selected = false;
  }

  foreach (int index in selectedIndices)
  {
    if (index < dgv.Rows.Count)
      dgv.Rows[index].Selected = true;
    else
      dgv.Rows[dgv.Rows.Count - 1].Selected = true;
  }

  if (selectedIndices.Count > 0 && selectedIndices[0] < dgv.Rows.Count && dgv.DataSource is BindingSource)
    ((BindingSource)dgv.DataSource).Position = selectedIndices[0];
}

static void SetSortInfo(this DataGridView dgv, int? sortColumnIndex, ListSortDirection sortOrder)
{
  if (sortColumnIndex == null)
    // Early out if there was no column used to sort in the data grid view
    return;

  // Restore the sort details
  dgv.Sort(dgv.Columns[(int)sortColumnIndex], sortOrder);
}

Используйте это для вызова вышеуказанных функций:

List<int> selectedIndices;
ListSortDirection sortOrder;
int? sortColumnIndex;
DataGridView dgv;

dgv.GetDataGridViewUIInfo(out selectedIndices, out sortColumnIndex, out sortOrder);

// Refresh the data source of the data gridview

dgv.SetDataGridViewUIInfo(selectedIndices, sortColumnIndex, sortOrder);
0 голосов
/ 30 июня 2011

Почему вы так часто обновляете данные? Много ли изменений? Вставки?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...