是否可以在加载gridview后将gridview id更改为gridview DataSource

时间:2014-03-26 17:42:50

标签: c# asp.net linq

在加载gridview后,是否可以将gridviews DataSouceId更改为gridview DataSouce。我的网格视图的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>

我尝试更改为空字符串。单击按钮时,这会编译但崩溃。

我正在尝试的是什么?

1 个答案:

答案 0 :(得分:0)

问题是查询定义了与GridView所期望的名称不同的列。例如,比较:

pk.First_Name

DataField="First Name"

这些是不同的,因此GridView无法在数据源中找到列并抛出异常。

最好的选择是在GridView中使用下划线。这可能需要在初始SQL中进行一些重构,但无论如何都应该这样做 - 在列名中有空格是非常脆弱且不常见的,更好地完全避免它:

<asp:BoundField DataField="First_Name" ...

或者您可以定义TemplateField,查找具有任一名称的列并显示找到的内容。但这听起来像是一个非常巨大的开销。