4

次のように定義されたデフォルトGridViewの a へのバインドがあります。SqlDataSourceSelectCommand

<asp:SqlDataSource ID="SqlDataSource1" runat="server" DataSourceMode="DataSet"
      ConnectionString="<%$ ConnectionStrings:MyConn %>" 
      ProviderName="MySql.Data.MySqlClient" 
      SelectCommand="select * from blah blah" />

実行時にこのクエリを動的に変更する必要がある場合があるため、次のようにします。

SqlDataSource1.SelectCommand = sql; // 'sql' is the new query
GridView1.PageIndex = 0;
GridView1.EditIndex = -1;
GridView1.SelectedIndex = -1;
GridView1.DataBind();
updatePanel.Update();

これは実際には問題なく動作しますが、ページネーション コントロールをクリックすると、結果セットはデフォルトSelectCommandSqlDataSource1.

これを回避する方法はありますか?

ありがとう、マーク

4

2 に答える 2

8

ここでの問題は、Pager リンクによって発行された送信時にページが読み込まれるときに、SqlDataSource が再作成されることです。動的に設定したものをロードするように指示するものは何もありません。パラメーターを指定してストアド プロシージャを使用すると、ASP はパラメーターを ViewState に保存し、ページが読み込まれたときに SqlDataSource で選択を再実行します。

したがって、最後に正しくロードされたときの SQL の内容を SqlDataSource に伝える必要があります。

これを行う最も簡単な方法は、SqlDataSource の SelectCommand を設定するときに SQL を ViewState に格納し、Page_Load イベントで再度取得して元に戻すことです。

例: いくつかの基準用の TextBox と [検索] ボタンがあるとします。ユーザーが TextBox にテキストを入力して [検索] ボタンをクリックすると、SQL が作成されます (ちなみに、これにより、SQL インジェクション攻撃にさらされる可能性が高くなります。基準を適切に設定します。) 次に、SqlDataSource の SelectCommand プロパティを設定します。この時点で、SQL を保存する必要があります。次に、Page_Load イベントでそれを取得し、SelectCommand プロパティをその値に設定します。

ボタンをクリックすると、SQL を保存できます。

Dim sSQL as String

sSQL = "SELECT somefields FROM sometable WHERE somefield = '" & Me.txtCriteria.Text & "'"
SqlDataSource1.SelectCommand = sSQL
ViewState("MySQL") = sSQL

次に、Page_Load イベントで SQL を取得し、SelectCommand プロパティを設定できます。

Dim sSQL as String

If Me.IsPostBack() Then
    sSQL = ViewState("MySQL")
    SqlDataSource1.SelectCommand = sSQL
End If
于 2011-02-28T15:37:54.807 に答える
0

1)動的ではなく、ページのプレビューからデータソースを設定してみてください。これが最も明確な解決策です。それができない場合は、

2) page_load の前にリストを生成してみてください。page_init の下にコードを配置するとうまくいくと思います。今は正確には思い出せませんが、page_load の前にメソッドがあります。

于 2010-07-23T15:06:17.897 に答える