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 的 Watcher 面板中看到它可以确定列表中的元素,但我无法弄清楚我需要将 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 表达式自动有效地处理 icky 反射;就像使用object,静态类型信息仍然丢失。)

于 2012-09-22T22:22:28.957 回答