使用自定义SortComparer时如何冻结datagridview中的第一行

时间:2012-08-02 12:33:43

标签: c# visual-studio-2010 datagridview

如何在使用自定义SortComparer时冻结Datagridview中的第一行? 没有SortComparer row[x].froozen = true;就可以做到。 但是使用SortComparer它不起作用

这是我的SortComparer代码:

DataGridView dg = (DataGridView)sender;

        if (e.Column.Index == 0)
        {
            e.SortResult = System.String.Compare(e.CellValue1.ToString(), e.CellValue2.ToString());

            if (e.SortResult == 0)
            {
                e.SortResult = System.String.Compare(
                    dg.Rows[e.RowIndex1].Cells[1].Value.ToString(),
                    dg.Rows[e.RowIndex2].Cells[1].Value.ToString());
            }

            e.Handled = true;
        }
        else if (e.Column.Index == 1)
        {

            e.SortResult = System.String.Compare(e.CellValue1.ToString(), e.CellValue2.ToString());

            if (e.SortResult == 0)
            {
                e.SortResult = System.String.Compare(
                    dg.Rows[e.RowIndex1].Cells[0].Value.ToString(),
                    dg.Rows[e.RowIndex2].Cells[0].Value.ToString());
            }
            e.Handled = true;
        }

1 个答案:

答案 0 :(得分:1)

您可以扩展SortComparer以检查第一行索引是否是顶行。如果是,请设置e.SortResult = 0或运行您要排序的任何代码。

  private void dataGridView1_SortCompare(object sender,  DataGridViewSortCompareEventArgs e)
  {
       DataGridView dg = (DataGridView)sender;
       if (e.RowIndex1 == 0) {
           e.SortResult = 0;
           e.Handled = true;
       } else {
         // rest of your comparison code
       }
  }

或者你可以通过检查行是否被冻结来使它变得更加花哨:

编辑以下内容不起作用,因为默认情况下,由于某种原因,行的Frozen属性设置为false

  private void dataGridView1_SortCompare(object sender,  DataGridViewSortCompareEventArgs e)
  {
       DataGridView dg = (DataGridView)sender;
       if (dg.Rows[e.RowIndex1].Frozen) {
           e.SortResult = -1;
           e.Handled = true;
       } else {
         // rest of your comparison code
       }
  }

编辑 e.SortResult = 0代替-1,因为相等的行将根据其当前位置进行排序。