我将对象集合绑定(bind)到DevExpress GridControl,并使用15.1 Data Annotations自定义外观。但是,我很难找到有关设置属性的列大小的任何信息。通过注释可以做到这一点吗?

带有注释的类:

public class DataFeedback
{
    [Display(Name = "Row Num", Order = 0)]
    public int RowNum { get; set; }
    [Display(Name = "Description", Order = 1)]
    public string Desc { get; set; }

    public DataFeedback(int rowNum, string desc)
    {
        RowNum = rowId;
        Desc = desc;
    }
}

简单绑定(bind)
var feedbackList = new List<DataFeedback>()
feedbackList.Add(new DataFeedback(1, "test"))
gridControl1.DataSource = feedbackList;

// only layout I've found so far
gridView1.BestFitColumns();

最佳答案

开箱即用,没有可用于指定UI网格的列大小的数据注释属性。 StringLength属性(和其他属性)用于指定数据库中的列大小以及用于数据验证的数据大小,但这已经足够了。

我对DevExpress控件不熟悉,但是如果它提供了自动列生成过程的功能,那么您可以执行与Telerik网格(http://geekswithblogs.net/sdorman/archive/2015/11/05/kendo-grid-mvc-wrapper-automatic-column-configuration.aspx)类似的操作。

在该解决方案中,我创建了一个自定义数据注释属性(类似于此属性):

public class GridColumnAttribute : Attribute, IMetadataAware
{
    public const string Key = "GridColumnMetadata";

    public string Width { get; set; }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues[GridColumnAttribute.Key] = this;
    }
}

然后,您装饰 View 模型:
public class DataFeedback
{
    [Display(Name = "Row Num", Order = 0)]
    [GridColumn(Width = "100px")]
    public int RowNum { get; set; }

    [Display(Name = "Description", Order = 1)]
    [GridColumn(Width = "300px")]
    public string Desc { get; set; }
 }

最后,在从列生成 Hook 调用的代码中,您将执行以下操作:
public static void ConfigureColumn<T>(GridColumnBase<T> column) where T : class
{
   CachedDataAnnotationsModelMetadata metadata = ((dynamic)column).Metadata;
   object attributeValue = null;
   if (metadata.AdditionalValues.TryGetValue(GridColumnAttribute.Key, out attributeValue))
   {
      var attribute = (GridColumnAttribute)attributeValue;
      column.Width = attribute.Width;
   }
}

看起来您可以通过使用受支持的Fluent API和With<T>扩展方法和/或可能挂接到RowCellStyle事件来执行此操作。 (https://documentation.devexpress.com/#WindowsForms/CustomDocument18017)

如果您不能参与列生成过程,则可以执行相同的操作,但是可以使用绑定(bind)网格后调用的扩展方法,就像调用BestFitColumns()一样。

关于c# - 列宽的数据注释,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31983281/

10-13 08:59
查看更多