使用List <t>作为数据源</t>时,DataGridView列名的Intellisense

时间:2011-08-31 19:52:57

标签: c# visual-studio datagridview

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

3 个答案:

答案 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查询构造包含使用特定属性修饰的属性名称的字符串数组,但在您的情况下可能不值得。