C# 在Gridview中使用匿名类型

C# 在Gridview中使用匿名类型,c#,asp.net,asp.net-ajax,C#,Asp.net,Asp.net Ajax,我想使用匿名类型作为GridView的源。但它将首先使用dropdownlist进行过滤。让我解释一下:我有一个类型,我定义如下: 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 Flow

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

    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}
            . . .
    }; 
当用户从列表中选择一项时,我希望获得相应的对象并将其绑定到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上抛出一个错误

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

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

        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);
这会对您有所帮助吗?

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

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

这对您有帮助吗?

您的问题是使用的是
可枚举的
。当您执行LINQ查询时,它会说
Id
不是
对象的一部分

试试这个

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)
sel
是一个
字符串
,因此需要将其转换为
int


2) 您需要使用
==
来比较

您的问题是您使用的是
可枚举的
。当您执行LINQ查询时,它会说
Id
不是
对象的一部分

试试这个

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)
sel
是一个
字符串
,因此需要将其转换为
int


2) 您需要使用
=
来比较首先,您希望
sel
SelectedValue
,而不是
SelectedItem
(这样您就可以获得
where
子句的
id
属性)。您还希望它是一个int,以便可以将其与LINQ查询中的
id
进行比较:

int sel = int.Parse(ddlEmployee.SelectedValue);
var selData = from d in data where d.Id == sel select d;
接下来,您可以将
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}
                                };

此时,您的
DataBind()
应该可以正常运行。

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

int sel = int.Parse(ddlEmployee.SelectedValue);
var selData = from d in data where d.Id == sel select d;
接下来,您可以将
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}
                                };

此时,您的
DataBind()
应该可以正常运行。

谢谢您的建议。不幸的是,我被3.5打动了,所以我不能尝试你的解决方案,但我确信它对+1有效you@RupeshSaini啊,我总是忘记
动态
是4.0的特性。祝你好运,我很高兴你能得到一些帮助!谢谢你的建议。不幸的是,我被3.5打动了,所以我不能尝试你的解决方案,但我确信它对+1有效you@RupeshSaini啊,我总是忘记
动态
是4.0的特性。祝你好运,我很高兴你能得到一些帮助!完美的正是我要找的!我还有一个与此相关的问题:我可以通过会话对象传递和检索“数据”吗?我应该用什么来铸造?@Rupesh Saini:这有点复杂,不太推荐,在这种情况下更喜欢定义类型。您可能可以使用一种叫做“示例铸造”的方法来实现这一点。把这个相关的问题看得完美!!正是我要找的!我还有一个与此相关的问题:我可以通过会话对象传递和检索“数据”吗?我应该用什么来铸造?@Rupesh Saini:这有点复杂,不太推荐,在这种情况下更喜欢定义类型。您可能可以使用一种叫做“示例铸造”的方法来实现这一点。请参阅与jadarnel27相同的评论。坚持使用3.5:(@RupeshSaini,尽快升级,你会错过一些新奇的东西:)4.5也差不多在这里;)与jadarnel27的评论相同。坚持使用3.5:(@RupeshSaini,尽快升级,你会错过一些新奇的东西:)4.5也差不多在这里;)可能的重复可能的重复