在Gridview中使用匿名类型

时间:2012-06-07 12:19:47

标签: c# asp.net asp.net-ajax

我想使用匿名类型作为GridView的源代码。但它将首先使用下拉列表进行过滤。让我解释一下:我有一个我定义的类型如下:

    IEnumerable<object> data = new[]{
    new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29}, 
    new{Name="John Jones", Id=2, Sal=12000d, Age=27}, 
    new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21}
            . . .
    }; 

我将此作为下拉列表的来源:

    ddlEmployee.DataSource=data;
    ddlEmployee.DataTextField = "Name";
    ddlEmployee.DataValueField = "Id";
    ddlEmployee.DataBind();

当用户从列表中选择一个项目时,我想获取相应的对象并将其绑定在Gridview中:

    var sel = ddlEmployee.SelectedItem.ToString();

   var selData = from d in data where **d.Id= sel** select d;
   gvSearchResults.DataSource = selData;
   gvSearchResults.DataBind();

但问题是因为我将d作为一个对象,它会在d.Id上抛出一个错误。

我该如何解决这个问题。请注意,我可能无法更改“数据”的定义,因为这是在应用程序之外进行控制的。我只是为了清楚起见而在这里展示。

3 个答案:

答案 0 :(得分:3)

您的问题是您正在使用Enumerable<object>。当您执行LINQ查询时,它会说Id不属于object

试试这个

var data = new[]{
new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29}, 
new{Name="John Jones", Id=2, Sal=12000d, Age=27}, 
new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21}
        . . .
};

另外,我不知道d.Id= sel是否是你所拥有的(*除外)。如果是这种情况,你需要改变一些事情

1)selstring,因此您需要将其转换为int

2)您需要使用==进行比较

答案 1 :(得分:1)

您可以使用“动态”数据类型,因此这样的工作原理:

        dynamic data = new[]{
           new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29}, 
           new{Name="John Jones", Id=2, Sal=12000d, Age=27}, 
           new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21}
        };

        Console.WriteLine(data[0].Name);

这对你有帮助吗?

答案 2 :(得分:1)

首先,您希望sel成为SelectedValue,而不是SelectedItem(以便获得id子句的where属性。您还希望它是一个int,以便您可以将它与LINQ查询中的id进行比较:

int sel = int.Parse(ddlEmployee.SelectedValue);

接下来,您可以将IEnumerable设置为dynamic类型的对象,以避免您提到的编译器错误:

IEnumerable<dynamic> data = new[]{
                                    new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29}, 
                                    new{Name="John Jones", Id=2, Sal=12000d, Age=27}, 
                                    new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21}
                                };

最后(as Caludio said),您确实想在LINQ查询中使用==运算符:

var selData = from d in data where d.Id == sel select d;

此时,您的DataBind()应该没有任何问题。