以编程方式为SqlDataSource设置ASP.NET参数不适用于回发

时间:2010-06-04 14:38:53

标签: asp.net gridview sqldatasource

我想以编程方式为SqlDataSource设置参数,如http://www.asp.net/data-access/tutorials/using-parameterized-queries-with-the-sqldatasource-vb中的步骤5所述。 GridView也绑定到sqlDataSource。我的标记是:

<asp:SqlDataSource ID="mySqlDataSource" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ConnectionStringHTL %>" 
    SelectCommand="SELECT [subscription_con] FROM [HTL_CONSUME_CON] WHERE ([subscription_con] = @subscription_con)">
    <SelectParameters>
        <asp:Parameter Name="subscription_con" Type="Int32" />
    </SelectParameters>
</asp:SqlDataSource>
<asp:GridView ID="myGridView" runat="server" AllowPaging="True" 
    AllowSorting="True" DataSourceID="mySqlDataSource">
</asp:GridView>

在代码隐藏中,我有:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load    
    mySqlDataSource.SelectParameters("subscription_con").DefaultValue = calcResult()
End Sub

来自calcResult()的返回值对于每个回发都是不同的。当用户单击具有UseSubmitBehavior = True的表单上的Button时,就会发生回发。

我已经使用调试器逐步执行后面的代码,我看到它为每个页面加载执行,我看到clacResult()返回的预期值。

然而,绑定的DataGrid永远不会在回发上更新,它只会在第一页加载时更新。

如果我更改SqlDataSource参数以将控件作为源,那么它适用于回发。换句话说,我改变了标记使用:

<asp:ControlParameter ControlID="myTextBox" Name="subscription_con" PropertyName="Text" Type="Int32" />

我将后面的代码更改为:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load    
   myTextBox.Text = calcResult()
End Sub

使用TextBox控件作为SqlDataSource参数的源,GridView的更新适用于原始页面加载和所有回发。但是,我真的不需要TextBox,也不想使用它。

关于如何以编程方式为SqlDataSource设置参数,我缺少什么?当没有控制源时,为什么在以编程方式设置SqlDataSource参数时,绑定的GridView不会在回发时更新?

2 个答案:

答案 0 :(得分:4)

您可能需要在回发时使用明确的数据绑定:

if (Page.IsPostBack)
{
    grid.DataBind();
}

应该这样做。

答案 1 :(得分:3)

C#

SqlDataSource1.SelectParameters["Where_Clause"] = new Parameter() { Name = "Where_Clause", DefaultValue = "WHERE m.Id = 1" };

贪婪的网络。