2012-04-26 2 views
0

Я искал много, но не смог найти решение. Вероятно, я использую неправильные ключевые слова. У меня есть класс, который является в основном расширенной версией элемента управления ListView.C# Массивы как свойства класса

Я определил некоторые пользовательские атрибуты для моего настроенного ListView, такие как имя_файла, 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"; 

EDIT: я просто не мог достичь того, чего я хотел. Не могли бы вы показать мне рабочий пример этого?

Этот список используется для отображения информации, взятой из базы данных. (Я использую ListView вместо DataGrid) Я хочу передать имена столбцов этому классу, который будет использоваться как для SQL-запроса «SELECT xxxxx, yyyyy, zzzz FROM table;» и имена столбцов this.columns.add ("xxxxx"); this.columns.add ("YYYYY"); this.columns.add ("ZZZZZ");

+0

Не уверен, что вы просите , Какая у вас проблема? –

+0

Так в чем вопрос? –

+0

Я просто не мог достичь того, чего хотел. Не могли бы вы показать мне рабочий пример этого? Я отредактировал вопрос, извините за это. – noway

ответ

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); 
    } 
} 
0

Вы добавляете столбцы в конструктор класса, прежде чем инициализировать элемент управления. Попробуйте отменить OnLoad событие вместо этого и сделать это там:

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

    foreach (var columnName in this.ColumnNames) 
     this.Columns.Add(columnName); 
} 
+0

Я не могу переопределить событие onload в классе mylistview. Могу ли я переопределить что-то еще? – noway

0

Я думаю, вы непонимание цели атрибута. Атрибут описывает элемент или класс, но, похоже, пытается использовать его как наследование.

Может быть, это то, что ваш ищете:

public class MyListView{ 
    public string[] ColumnNames {get; set;} 
} 
Смежные вопросы