使用属性指定列FillWeight

时间:2017-06-14 23:43:01

标签: c# datagridview attributes datagridviewcolumn

我有一个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

感谢。

2 个答案:

答案 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);
    }
}