http://www.asp.net/data-access/tutorials/using-parameterized-queries-with-the-sqldatasource-vbの手順 5 で説明されているように、プログラムで SqlDataSource のパラメーターを設定したいと考えています。また、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 のフォームでユーザーがボタンをクリックすると発生します。
デバッガーを使用してコード ビハインドをステップ実行すると、ページが読み込まれるたびにデバッガーが実行され、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 がポストバックで更新されないのはなぜですか?