通过单击标题对C#排序DataGridView给出错误的顺序

时间:2019-02-13 11:16:42

标签: c# winforms sorting datagridview

我在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排序。

第二到第五列每次都正确排序。

第六和第七列每次排序都不正确,在解决之前,前三列会有所不同。

1 个答案:

答案 0 :(得分:0)

事实证明,空结果是空字符串(因为数据为空),即使其他网格对此感到非常满意,也使排序混乱。

将数据获取中的空值更改为空字符串,现在排序非常愉快。