C# 在Gridview中使用匿名类型
我想使用匿名类型作为GridView的源。但它将首先使用dropdownlist进行过滤。让我解释一下:我有一个类型,我定义如下: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
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也差不多在这里;)可能的重复可能的重复