0

我搜索了很多,但找不到任何解决方案。我可能使用了错误的关键字。我有一个类,它基本上是 ListView 控件的扩展版本。

我为我的自定义 ListView 定义了一些自定义属性,例如 FileName、OrderType 等,它们工作正常。

我还想将一个数组传递给我的类,其中包括 ColumnNames 以填充类中的数据。

课堂MyListView

public class ColumnNames : Attribute
{
    public string[] Values { get; set; }

    public ColumnNames(params string[] values)
    {
        this.Values = values;
    }
}

[ColumnNames("a1","a2","a3","a4","a5","a6","a7","a8","a9")]

public MyListView() {

     for (int i = 0; i < 7; i++)
            this.Columns.Add(this.ColumnNames[i]);

    }

课堂Form1

MyListView lstv = new MyListView();

lstv.ColumnNames[0] = "hede1";
lstv.ColumnNames[1] = "hede2";
lstv.ColumnNames[2] = "hede3";

编辑:我根本无法实现我想要的。你能给我看一个可行的例子吗?

我使用这个列表视图来显示从数据库中获取的信息。(我使用 ListView 而不是 DataGrid)我想将列名传递给这个类,这将用于 SQL 查询“SELECT xxxxx, yyyyy, zzzz FROM table;” 和列名 this.columns.add("xxxxx"); this.columns.add("yyyyy"); this.columns.add("zzzzz");

4

3 回答 3

1

如果你想坚持这个属性,你可以像这样访问它的数据:

var attributes = this.GetType().GetCustomAttributes(typeof(ColumnNames), false);
foreach (var attr in attributes)
{
    var a = attr as ColumnNames;
    foreach (var column in a.Values)
    {
        this.Columns.Add(column);
    }
}
于 2012-04-26T22:33:29.513 回答
0

在初始化控件之前,您正在类构造函数中添加列。尝试覆盖OnLoad事件并在那里执行:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    foreach (var columnName in this.ColumnNames)
        this.Columns.Add(columnName);
}
于 2012-04-26T22:26:30.147 回答
0

我认为您误解了属性的目的。属性描述了一个成员或类,但似乎试图像继承一样使用它。

也许这就是您正在寻找的:

public class MyListView{
   public string[] ColumnNames {get; set;}
}
于 2012-04-26T22:28:27.793 回答