【问题标题】:How to programmatically convert column type in DataGridView C#?如何以编程方式转换 DataGridView C# 中的列类型?
【发布时间】:2010-10-22 09:39:48
【问题描述】:

我在表单上动态创建了 DataGridView 控件,DataSource 指定为:

    ((DataGridView)createdControl).DataSource = (IList)(p.GetValue(editedClient, null));

其中 IList 被定义为以下类的通用集合:

     public class CDocumentOperation

   {
        [DisplayName(@"Time")] 
        public DateTime TimePosted { get; set; }
        [DisplayName(@"User")]
        public CUser User { get; set; }
        [DisplayName(@"Action")]
        public string Action { get; set; }
    }

grid 已成功填充数据,但唯一的问题是所有列 被创建为文本字段。我需要的是手动转换列 绑定到用户字段,具有按钮或链接(将列类型转换为DataGridViewButtonColumn)。

我可以这样做吗,无需在创建网格帖子时修改网格自动填充,无需手动 适当类型的列创建和数据复制?

【问题讨论】:

    标签: c# .net datagridview button


    【解决方案1】:

    简短的回答是,如果不在绑定之前手动创建列(并设置DataPropertyName 属性),就无法做到这一点。没有可用于装饰数据源的属性,DataGridView 将为每种数据类型生成一个 DataGridViewTextBoxColumnBoolean 除外,它将解析为复选框列)。此行为是内部的且不可更改。

    您最好的选择是在网格上禁用AutoGenerateColumns,并编写您自己的方法来动态生成适当的列类型,可能基于您自己的自定义属性,例如(来自您上面的示例):

    [DisplayName(@"Time"), ColumnType(typeof(DataGridViewButtonColumn))] 
    public DateTime TimePosted { get; set; }
    

    属性类很容易编写(只需扩展Attribute,添加Type 字段和适当的构造函数)。在将生成列的方法中(就在绑定之前),您可以使用反射来抓取属性并检查自定义属性是否存在。 (BindingSource.GetItemProperties() 对于获取集合中对象的属性信息非常有用。)

    这不是最优雅的解决方案(它深入研究了一些中级概念),但它是通过DataGridView 控件中自动生成的列来解决此限制的唯一方法。

    【讨论】:

      猜你喜欢
      • 2017-03-06
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 2011-01-30
      • 1970-01-01
      • 2019-04-09
      相关资源
      最近更新 更多