DataGridView单元自定义

时间:2011-09-01 19:18:35

标签: c# datagridview datagridviewcolumn

我想为datagridview创建一个单元格,该单元格将接受Int64值以进行排序。

此外,该单元格将显示一个额外值,该值是当前值与我在datagridview之外的参考值之差。

我可以将它作为字符串,但排序将无法正确处理,因为它看起来像1,10,11,2 ......等等。

所以我认为如果我可以创建一个自定义单元格并将单元格值定义为long并显示一个字符串就会很棒......但我不确定这是否可以实现....

有人知道如何以简单的方式完成这项工作?请注意,我手动加载datagridview,但我正在定义列类型以允许排序。

1 个答案:

答案 0 :(得分:0)

一种相当简单的方法是使用DataGridView的SortCompare事件。使用该事件检查正在排序的列是否显示您的自定义数据,如果是,请提取该数据的数字部分并对其进行排序。

下面我有一个例子:

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e) {
    if (e.Column.Index == 1) {  // This is your custom data's column.
        // Extract the numeric values from the cells being compared for the sort.
        // BEWARE: code assumes you'll always be able to extract a long from the cell contents.
        long cell1NumericValue = Int64.Parse(e.CellValue1.ToString().Split(' ')[0]);
        long cell2NumericValue = Int64.Parse(e.CellValue2.ToString().Split(' ')[0]);

        // Compare these numeric values to determine how to sort.
        e.SortResult = cell1NumericValue.CompareTo(cell2NumericValue);

        e.Handled = true;
    }
}

假设:
- 包含自定义数据的列位于列索引1
- 您的自定义数据由一个数字后跟至少一个空格

组成

我的代码还假设单元格值的转换永远不会引发错误。您的数据可能包含会导致此转换失败的值。在这种情况下,您可以做的是在转换之前验证您的数据(它不是空的等等),如果验证失败,则将单元格的数值用于排序,将其设置为-1或其他值,以便它始终低于有效值其他细胞。 (我希望这是有道理的)。

this MSDN article中详细描述了应用这些类型的排序。你可能想看看。其中一个示例显示了在tie的情况下你可以做什么(该示例显示在另一列上排序作为排序仲裁器)。