【发布时间】:2016-08-22 11:39:38
【问题描述】:
我有一个桌面应用程序,我在表单上使用 DataGridView。我冻结了第一排。但是当我在 DataGridView 中单击列的标题时,第一行的位置也在发生变化。如何在我排序时忽略第一行。
【问题讨论】:
标签: c# datagridview desktop-application datagridviewcolumn
我有一个桌面应用程序,我在表单上使用 DataGridView。我冻结了第一排。但是当我在 DataGridView 中单击列的标题时,第一行的位置也在发生变化。如何在我排序时忽略第一行。
【问题讨论】:
标签: c# datagridview desktop-application datagridviewcolumn
在DataGridView 的SortCompare 事件的SortCompare 事件处理程序中,试试这个:
private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
if (e.RowIndex1 == 0)
{
e.Handled = true;
}
else
{
e.Handled = false;
}
}
【讨论】:
本质上,您要求的是能够仅对DataGridView 的一部分进行排序。据我所知,没有简单或标准的方法可以做到这一点,Filip 对此问题的回答也反映了这一点:Sorting selected rows in DataGridView。这并不意味着不可能实现您想要的行为。
Filip 提供了一个实现,在这个question 中,Justin 提供了您必须稍微修改的代码,但这可能适合您的需要。该问题询问如何在DataGridView 中向上或向下移动一行,但我认为您可以修改他的实现以在排序后将要保持静态的行一直移动到顶部。根据您排序的行数,第一行可能会消失并重新出现。但是,如果您的数据集相对较小,我无法想象第一行的短暂闪烁被排序到某个随机位置然后添加回顶部会导致任何重大问题。
【讨论】:
private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
int so = 1;
if (dataGridView1.SortOrder == SortOrder.Ascending)
{
so = -1;
}
if (e.RowIndex1 == 0 )
{
e.SortResult = so;
e.Handled = true;
}
if (e.RowIndex2 == 0)
{
e.SortResult = -so;
e.Handled = true;
}
}
此代码通过相应地设置第一行的排序结果,将第一行始终放在排序列表的顶部。
【讨论】: