【问题标题】:Sorting a datagrid columns, I have the code and it sort of works对数据网格列进行排序,我有代码,它有点工作
【发布时间】:2008-12-05 00:28:19
【问题描述】:

我正在尝试对数据网格 A 到 Z 的列进行排序,除了我在“A”之间得到一个以“c”开头的列(例如 a、a、a、a、c ,a,a,b,b,b),这发生在我第一次运行代码时。如果我然后使用 columnNames.Reverse(); (Z 到 A)然后重新运行 columnNames.Sort() (A 到 Z)它会正确排序。为什么会这样?

 List<string> columnNames = new List<string>();
 foreach (DataGridViewColumn col in dataGridView1.Columns)
 columnNames.Add(col.HeaderText);
 columnNames.Sort();
 foreach (DataGridViewColumn col in dataGridView1.Columns)
     col.DisplayIndex = columnNames.IndexOf(col.HeaderText);

谢谢

【问题讨论】:

    标签: c# datagrid


    【解决方案1】:

    在您的示例(“(a,a,a,a,c,a,a,b,b,b)”)中,列名不是唯一的。因此,在排序的名称列表中,“a”的(第一个)索引将为 0,“b”的(第一个)索引将为 5,“c”的(第一个)索引将为 8。

    因此,当您遍历列时,您将反复将带有文本“a”的列设置为索引“0”。第二次执行此操作时,该位置的第一列将被移动以腾出空间。结果更像是洗牌而不是排序,最终的顺序取决于原始顺序。这就是第二次排序工作正常的原因——在第一次通过时,您将元素排列得“足够接近”以使第二次尝试成功。

    类似下面的内容呢?它将唯一地分配索引,并且效率更高。 (对 IndexOf 的每次调用都是 O(N),因此您的原始代码是 O(N^2) - 这只是 O(N log N),至少假设列集合在您设置索引时不会重新排列太多.)

    List<DataGridViewColumn> columns = new List<DataGridViewColumn>(dataGridView1.Columns);
    columns.Sort( delegate(DataGridViewColumn a, DataGridViewColumn b) {
                   return String.Compare( a.HeaderText, b.HeaderText ); }
    int n = 0;
    foreach( DataGridViewColumn col in columns )
       col.DisplayIndex = n++;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      相关资源
      最近更新 更多