优雅地刷新DataGridView中的数据

时间:2011-06-30 10:42:46

标签: c# winforms datagridview

我在Windows窗体中有一个DataGridView,这个网格包含接近实时的数据 - 我希望它至少每20秒更新一次。我的网格绑定到我以编程方式生成的DataTable,因此我目前有一个生成此DataTable的计时器,并每隔20秒将其分配给网格。

但我遇到的问题是,当刷新数据时,网格上的任何选择或排序都会消失,这是一个很大的可用性问题。有没有其他方法来刷新网格的内容,保留选择/排序?

4 个答案:

答案 0 :(得分:2)

恢复排序顺序和行选择的粗略指南。

在刷新之前执行此操作:

// 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 :(得分:1)

您需要保存您的选择,然后重新加载数据并重新应用保存的选择。

这实际上是一个相当简单的过程,但我没有在Winforms中编写代码来提供完整的示例,但该过程与...类似;

循环访问DataGridViewItems。存储索引和/或键和选择标准。

重新加载数据。

循环访问DataGridViewItems。检索存储的选择标准,其中索引/键匹配并应用。

答案 2 :(得分:0)

为什么经常刷新数据?有很多变化吗?插入?

如果使用新记录更新网格,只需将它们附加到网格的行集合即可。

答案 3 :(得分:0)

我喜欢马丁的答案。但是我发现在刷新数据源后,变量oldSortColumn会以某种方式发生变化,而数据gridview不会在&#34; uiGrid.Sort(oldSortColumn,oldSortOrder)&#34;中接受它。此外,uiGrid.Sort不喜欢oldSortColumn为null。我很感激,如果有人能让我知道为什么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);