我在Windows窗体中有一个DataGridView,这个网格包含接近实时的数据 - 我希望它至少每20秒更新一次。我的网格绑定到我以编程方式生成的DataTable,因此我目前有一个生成此DataTable的计时器,并每隔20秒将其分配给网格。
但我遇到的问题是,当刷新数据时,网格上的任何选择或排序都会消失,这是一个很大的可用性问题。有没有其他方法来刷新网格的内容,保留选择/排序?
答案 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);