我有一个DataGridView,我用BindingList填充。 BindingList是类型SyncDetail
的列表,它具有许多属性。在这些属性中,我可以使用属性来决定是否不显示列(Browsable(false)
),列的显示名称(DisplayName("ColumnName")
)等。请参阅下面的示例:
public class SyncDetail : ISyncDetail
{
// Browsable properties
[DisplayName("Sync Name")]
public string Name { get; set; }
// Non browsable properties
[Browsable(false)]
[XmlIgnore]
public bool Disposed { get; set; }
}
有没有办法可以使用属性来定义列宽应该设置为什么?例如[ColumnWidth(200)]
。如果可能,我想设置FillWeight
,因为AutoSizeColumnsMode
设置为Fill
。
感谢。
答案 0 :(得分:0)
我最终实现了一个自定义属性来执行此操作。
public class ColumnWeight : Attribute
{
public int Weight { get; set; }
public ColumnWeight(int weight)
{
Weight = weight;
}
}
然后我可以覆盖我的DataGridView的OnColumnAdded方法来获取属性并为列设置FillWeight。
protected override void OnColumnAdded(DataGridViewColumnEventArgs e)
{
// Get the property object based on the DataPropertyName of the column
var property = typeof(SyncDetail).GetProperty(e.Column.DataPropertyName);
// Get the ColumnWeight attribute from the property if it exists
var weightAttribute = (ColumnWeight)property.GetCustomAttribute(typeof(ColumnWeight));
if (weightAttribute != null)
{
// Finally, set the FillWeight of the column to our defined weight in the attribute
e.Column.FillWeight = weightAttribute.Weight;
}
base.OnColumnAdded(e);
}
然后我可以在我的对象属性上设置属性。
public class SyncDetail : ISyncDetail
{
// Browsable properties
[DisplayName("Sync Name")]
[ColumnWeight(20)]
public string Name { get; set; }
etc...
}
答案 1 :(得分:0)
根据您的原始答案,我用稍微扩展了用例,可以与绑定到具有整数值的不同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);
}
}