我搜索了很多但找不到任何解决方案。我可能使用了错误的关键字。我有一个类,它基本上是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显示从数据库中获取的信息。 (我使用ListView而不是DataGrid)我想将列名传递给这个类,它将用于SQL查询“SELECT xxxxx,yyyyy,zzzz FROM table;”和列名this.columns.add(“xxxxx”); this.columns.add( “YYYYY”); this.columns.add( “ZZZZZ”);
答案 0 :(得分: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);
}
}
答案 1 :(得分:0)
在初始化控件之前,您正在类构造函数中添加列。尝试覆盖OnLoad
事件,并在那里执行:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
foreach (var columnName in this.ColumnNames)
this.Columns.Add(columnName);
}
答案 2 :(得分:0)
我认为你误解了属性的目的。属性描述了一个成员或类,但似乎试图像继承那样使用它。
也许这就是你要找的东西:
public class MyListView{
public string[] ColumnNames {get; set;}
}