根据您的原始答案,我做了一个稍微扩展的用例,可以与绑定到不同 Column 属性的多个数据网格一起使用,这些属性以整数值作为后盾。
在 SyncDetails 类中使用 Width 和 MinimumWidth 属性的示例:
[ColumnProperty("MinimumWidth",100)]
[ColumnProperty("Width",250 )]
public string Name{get;set;}
然后我的属性定义被更新为允许多个属性:
[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
public class ColumnPropertyAttribute:Attribute
{
public string ColumnPropertyName { get; set; }
public int ColumnValue { get; set; }
public ColumnPropertyAttribute(string columnPropertyName, int columnValue)
{
ColumnValue = columnValue;
ColumnPropertyName = columnPropertyName;
}
}
在 _ColumnAdded 事件中,我们查找数据网格绑定到的任何类型,从中提取自定义属性,然后尝试应用该值。我将所有内容绑定到 BindingList<T>,因此 .GetGenericArguments() 返回该类型 T 用于自定义属性查找,但可以根据其他应用程序的需要进行调整。
private void DataGridView1_ColumnAdded(object sender, DataGridViewColumnEventArgs e)
{
try
{
var propInfo = (sender as DataGridView).DataSource.GetType().GetGenericArguments()[0].GetProperty(e.Column.DataPropertyName);
if (propInfo != null)
{
var customAttributes = propInfo.GetCustomAttributes<ColumnPropertyAttribute>();
foreach (var ca in customAttributes)
{
var column = e.Column;
var propToChange = e.Column.GetType().GetProperty(ca.ColumnPropertyName);
propToChange.SetValue(column, ca.ColumnValue);
}
}
}
catch (Exception ex)
{
Console.WriteLine("Exception processing custom _ColumnAdded properties: " + ex.Message);
}
}