如何以编程方式转换DataGridView C#中的列类型?

时间:2010-10-22 09:39:49

标签: c# .net datagridview button

我在表单上动态创建了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; }
    }

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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