1

DataGridViewにデータを入力するための次のコードがあります

        var results = from loc in dtLocations.AsEnumerable()
                      join con in dtContacts.AsEnumerable() on (int)loc["contactid"] equals (int)con["id"]
                      select new
                      {
                          id = con["id"],
                          mpoc = loc["mpoc"],
                          directno = loc["directno"],
                          extension = loc["extension"],
                          faxno = loc["faxno"],
                          billing = con["billing"],
                          fullname = con["fullname"],
                          mobno = con["mobno"],
                          email = con["email"]
                      };

        dgv.AutoGenerateColumns = false;
        dgv.DataSource = results.ToList<object>();

しかし、セルをクリックすると読み戻せません

    private void dgvLocations_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        DataGridView dgv = sender as DataGridView;
        ????? vals = ((List<object>)dgv.DataSource)[e.RowIndex];
        object id = vals.id;  //errors of course
    }

Visual Studioのウォッチャーパネルでリスト内の要素を判別できることがわかりますが、それらを再度読み取るためにvalsを設定する必要があるタイプを理解できません:(

ここに画像の説明を入力してください

4

1 に答える 1

1

new { .. })は匿名タイプを導入します。匿名タイプは、静的に既知の(「コンパイル時」)名前で指定することはできません。

名前付き(匿名ではない)タイプを使用します(ここMyRowで、は必要なプロパティを持つ定義済みのクラスです)。

// Put data in non-anonymous type
select new MyRow {
   id = ..,
}

// Now can use a name statically
MyRow row = (MyRow)data[rowIndex];

また、このdynamicタイプはC#/。NET4+で使用できます。または、さらに厄介でobject、明示的な反射。(dynamic-typed式は、厄介な反射を自動的に効果的に処理することに注意してください。同様にobject、静的型付け情報は引き続き失われます。)

于 2012-09-22T22:22:28.957 に答える