我在表单上动态创建了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
)。
我是否可以这样做,无需修改网格帖子创建时的网格自动填充,无需手动 列创建适当的类型和数据复制?
答案 0 :(得分:1)
简短的回答是,如果不在绑定之前手动创建列(并设置DataPropertyName
属性),则无法完成此操作。您没有可用于装饰数据源的属性,DataGridView
只会为每种数据类型生成DataGridViewTextBoxColumn
(Boolean
除外,它将解析为复选框列)。此行为是内部的,不可更改。
最好的办法是在网格上禁用AutoGenerateColumns
并编写自己的方法,动态生成相应的列类型,可能基于您自己的自定义属性,例如(来自上面的示例):
[DisplayName(@"Time"), ColumnType(typeof(DataGridViewButtonColumn))]
public DateTime TimePosted { get; set; }
属性类易于编写(只需扩展Attribute
,添加Type
字段和适当的构造函数)。在将生成列的方法中(紧接在绑定之前),您可以使用反射来抓取属性并检查是否存在自定义属性。 (BindingSource.GetItemProperties()
对于获取有关集合中对象属性的信息非常有用。)
这不是最优雅的解决方案(它深入研究了一些中级概念),但它是通过DataGridView
控件中自动生成的列来解决此限制的唯一方法。