0

私はたくさん検索しましたが、解決策が見つかりませんでした。おそらく間違ったキーワードを使用しています。基本的に ListView コントロールの拡張バージョンであるクラスがあります。

FileName、OrderType など、カスタマイズした ListView のカスタム属性をいくつか定義しましたが、正常に動作します。

また、クラス内にデータを入力するために、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";

編集:私は単に私が望んでいたことを達成できませんでした。これの実例を見せていただけますか?

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

You're adding columns in the class constructor, before the control is being initialized. Try to override the OnLoad event instead and do it there:

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 に答える