我有一个DataGridView,它有4列需要格式化。此DataGridView的dataSource是具有4个属性的类的对象的通用列表。
在设计时,如何使用 intelisense 指定列?
DataGridView dgv = new DataGridView();
List<MyDataRow> myDataList = new List<MyDataRow>();
// List is populated in this section of code...
dgv.DataSource = myDataList;
dgv.Columns["ALongDescriptiveNameThatCouldEasilyBeMistyped"].Width = 80; .
// dgv is added to a form and displayed in this section of code
public class MyDataRow
{
public string FirstName { get; set; }
public string LastName { get; set; }
public double ALongDescriptiveNameThatCouldEasilyBeMistyped { get; set; }
public int YearsOfService { get; set; }
public int MonthsOfService { get; set; }
}
答案 0 :(得分:1)
您可以使用以下类,其中包含使用表达式树作为参数的方法,以根据lambda表达式确定成员名称:
public class MemberHelper<T> where T : class
{
public string GetName<U>(Expression<Func<T, U>> expression)
{
MemberExpression memberExpression = expression.Body as MemberExpression;
if(memberExpression != null)
return memberExpression.Member.Name;
throw new InvalidOperationException("Member expression expected");
}
}
您可以使用如下方法:
MemberHelper<MyDataRow> memberHelper = new MemberHelper<MyDataRow>();
dgv.Columns[memberHelper.GetName(d => d.FirstName)].Width = 80;
答案 1 :(得分:0)
最简单的方法是声明包含列名的枚举,其中包含从0到N的指定整数值,并使用该枚举进行基于索引的对DataGrid列的访问。
像这样的伪代码:
enum ColumnNames
{
ColumnName1 = 0,
ColumnName2 = 1,
ColumnName3 = 2,
.....
.....
}
答案 2 :(得分:0)
Intellisense无济于事,因为Columns只是int / string索引器。您可以在属性和一些反射上使用属性,然后使用Linq查询构造包含使用特定属性修饰的属性名称的字符串数组,但在您的情况下可能不值得。