2012-04-26 7 views
0

私は多くを検索しましたが、解決策は見つかりませんでした。私はおそらく間違ったキーワードを使用しています。私は基本的にListViewコントロールの拡張版であるクラスを持っています。クラスプロパティとしてのC#配列

カスタマイズしたListViewのカスタム属性をFileName、OrderTypeなどのように定義していて、うまく動作します。

クラス内にデータを取り込むためにColumnNamesを含む配列をクラスに渡したいとします。 Form1クラス

MyListView lstv = new MyListView(); 

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

EDITで

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]); 

    } 

私は単に私が欲しかったものを達成できませんでした。この実例を私に見せてもらえますか?

私はこのリストビューを使用して、データベースから取得した情報を表示します。 (私はDataGridの代わりにListViewを使用します)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

mylistviewクラスでonloadイベントをオーバーライドすることができません。他のものを無効にすることはできますか? – noway

0

私はあなたが属性の目的を誤解していると思います。属性はメンバーまたはクラスを記述しますが、継承のように使用しようとしているようです。

多分これはあなたが探しているものです。

public class MyListView{ 
    public string[] ColumnNames {get; set;} 
} 
関連する問題