我在C#WinForms应用程序中有一个DataGridView,该应用程序有7列,用于两个方案,分别称为方案A和方案B,它们使用完全相同的数据,但显示不同的列:-
第一列从不可见(它是内部ID)
第二和第三列始终可见
第四和第五列在方案A中可见
场景B中可见第六列和第七列
数据源是一个绑定源,第二到第七列都以完全相同的方式在DataGridView的Columns Collection属性中设置。每列之间的唯一区别是HeaderText,DataPropertyName和Width。
具体地说,所有六列的SortMode设置为Automatic,ColumnType设置为DataGridViewTextBoxColumn。
每个列都是一个数据绑定列,绑定到绑定源的一个字段。
所有列均显示正确的数据。
在任何一种情况下,如果我单击第二列或第三列的标题,它们将正确排序(升序和降序)。
如果我在方案A中显示了第4列和第5列,然后单击其中任何一个的标题,则它们都正确排序(升序和降序)。
如果我在方案B中显示了第六列和第七列,然后单击其中的任何一个标题,它们的排序都将不正确,升序和降序。
即使是陌生人,第六和第七列每次也不给出相同的结果。
例如,假设第六列中的数据为空,空,A,A,B,B,B,C,D,D
数据最初按第二列排序,因此第六列未排序。
我单击第六列的标题,排序箭头显示升序,但数据为空,B,空,D,C,A,B,A,D,B
我再次单击第六列的标题,现在排序箭头显示降序,但是数据为B,空,C,D,D,空,A,B,A,B
我再次单击第六列的标题,排序箭头显示升序,但是数据现在为空,D,C,A,空,B,B,A,D,B,与之前的升序不同< / p>
我再次单击第六列的标题,排序箭头现在显示降序,但是数据现在为D,空,A,B,B,空,C,D,A,B,与之前的降序不同
但是,在第三个周期之后,它似乎稳定在一个顺序上,仍然没有正确排序,但至少是稳定的,因此从现在开始,每个升序都是相同的,每个降序都是相同的,直到我关闭并重新-打开表单。
该网格根本没有排序代码,它可以自行处理。
代码非常简单(简化为相关位,并为清楚起见更改了名称):-
在表单的Load事件中,将获取数据并将其分配给绑定源。无论情况如何,数据都是完全相同的。
然后我根据情况将第四至第七列的Visible标志设置为true或false(在设计器中将所有四列都设置为visible = true)。
private void Form_Load(object sender, EventArgs e)
{
GetData();
SetColumnsVisible();
}
private void GetData()
{
_bindingSource.DataSource = _dataService.GetData();
}
private void SetColumnsVisible()
{
if (_scenario == ScenarioA)
{
dgvData.Columns["ColumnFour"].Visible = true;
dgvData.Columns["ColumnFive"].Visible = true;
dgvData.Columns["ColumnSix"].Visible = false;
dgvData.Columns["ColumnSeven"].Visible = false;
}
if (_scenario == ScenarioB)
{
dgvData.Columns["ColumnFour"].Visible = false;
dgvData.Columns["ColumnFive"].Visible = false;
dgvData.Columns["ColumnSix"].Visible = true;
dgvData.Columns["ColumnSeven"].Visible = true;
}
dgvData.ColumnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.False;
}
该表单的所有其余代码与排序无关,并且都可以正常工作。
我放入一个事件来捕获列标题的点击,以查看是否试图按不可见的列之一进行排序,但是列索引在每种情况下都是正确的,例如如果我在方案B中,然后单击第六列的标题,则列索引为5(因为索引从0开始)。
并不是说按不同的列进行排序会在头几次解释不同的结果,但是值得一试。
任何人都没有DataGridView会在您单击列进行排序时产生随机结果吗?
或者对如何解决它有任何想法?
总结:-
两种方式使用的数据完全相同。
各列的设置完全相同。
没有排序代码,只有默认的DataGridView排序。
第二到第五列每次都正确排序。
第六和第七列每次排序都不正确,在解决之前,前三列会有所不同。
答案 0 :(得分:0)
事实证明,空结果是空字符串(因为数据为空),即使其他网格对此感到非常满意,也使排序混乱。
将数据获取中的空值更改为空字符串,现在排序非常愉快。