是否可以在gridview加载后将gridview DataSouceId
更改为gridview DataSouce ?我有一个gridview,它的DataSouceId
等于SqlDatasource
。我有一个按钮,当按下执行一些LINQ,我想改变什么是在gridview。
var sce = from pk in db.Tables
where pk.Score > 20
select new { pk.First_Name, pk.Last_Name, pk.Score };
GridView1.DataSourceID = "";
GridView1.DataSource = sce;
GridView1.DataBind();
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="First Name" DataSourceID="SqlDataSource2" AllowSorting="True">
<Columns>
<asp:BoundField DataField="First Name" HeaderText="First Name" ReadOnly="True" SortExpression="First Name" />
<asp:BoundField DataField="Last Name" HeaderText="Last Name" SortExpression="Last Name" />
<asp:BoundField DataField="Score" HeaderText="Score" SortExpression="Score" />
<asp:BoundField DataField="Nationality" HeaderText="Nationality" SortExpression="Nationality" />
</Columns>
</asp:GridView>
我试图更改为空字符串。此程序可以编译,但在单击按钮时崩溃。
我所尝试的是可能的吗?
问题是查询定义的列与GridView期望的名称不同。例如,比较:
pk.First_Name
和
DataField="First Name"
这些是不同的,因此GridView无法在数据源中找到列并抛出异常。
最好的选择是在GridView中使用下划线。这可能需要在初始SQL中进行一些重构,但无论如何都应该这样做——在列名中使用空格是非常脆弱和不常见的,最好完全避免这样做:
<asp:BoundField DataField="First_Name" ...
或者您可以定义一个TemplateField
,它查找具有任意名称的列并显示找到的列。但是这听起来像是一个巨大的开销。