我将一组对象绑定到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; } }
简单绑定
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; } }
然后,您装饰您的视图模型:
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; } }
最后,在从列生成钩子中调用的代码中,您将执行与此类似的操作:
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; } }
看起来您可能可以通过使用支持的流畅API和“< T>扩展方法和/或可能挂钩到RowCellStyle事件. (https://documentation.devexpress.com/#WindowsForms/CustomDocument18017)
如果您无法挂接到列生成过程中,您可能会做同样的事情,但使用自己的扩展方法,在网格绑定后调用,就像您在调用BestFitColumns()时一样.