我将对象集合绑定(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/