当前位置:  开发笔记 > 编程语言 > 正文

如何在datagridview列中显示枚举值

如何解决《如何在datagridview列中显示枚举值》经验,为你挑选了1个好方法。

我有这个数据库,不是我的设计,但我必须使用它,它包含一个像这样的表:

 id  |   Name     |  status  | ...
-----+------------+----------+------
 1   |  Product1  |  2       | ...
 2   |  Product2  |  2       | ...
 3   |  Product3  |  3       | ...
 ... |  ...       |  ...     | ...

status属性是指枚举所在的位置

0 = Invalid
1 = Dev
2 = Activ
3 = Old

当我在只读数据网格视图中显示它时,我希望用户看到枚举的名称(Dev,Activ,...)或描述而不是数值.datagridview绑定到来自DAL的数据表,同样不属于我的设计,因此我无法真正更改数据表.我发现如何做到这一点的唯一方法是通过监听datagridview.CellFormating事件,我把这个代码:

private void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.ColumnIndex == 3) // column of the enum
    {
        try
        {
            e.Value = getEnumStringValue(e.Value);
        }
        catch (Exception ex)
        {
            e.Value = ex.Message;
        }
    }
}

这工作正常,但如果我有大约1k(不是那么多)或更多的项目,它需要永远...有更好的方法来做到这一点?

---编辑---
这样可以正常工作,我的问题是,如果数据表中有超过1000行,则需要永远.问题是CellFormating事件会触发每一列,甚至是那些不需要它的列.假设我显示15列并且有1000行,那么该事件会触发15 000次......

有没有比使用CellFormating事件更好的方法?或者有没有办法将CellFormating事件添加到一个列?或者是什么 ?



1> BFree..:

我不会在CellFormatting上做到这一点.我会攻击DataTable本身.我会添加一个具有枚举类型的行,并通过表循环并添加值.像这样的东西:

    private void Transform(DataTable table)
    {
        table.Columns.Add("EnumValue", typeof(SomeEnum));
        foreach (DataRow row in table.Rows)
        {
            int value = (int)row[1]; //int representation of enum
            row[2] = (SomeEnum)value;
        }
    }

然后,在DataGridView中,只隐藏具有枚举的整数表示的列.


是的,它会加快速度,因为这会在你绑定之前发生,你不需要搞乱所有的格式化事件.您可以尝试在执行此操作之前克隆DataTable,这样原始版本就不会搞砸了.我仍然认为它会更快.试一试.
推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有