DOBON.NET DOBON.NETプログラミング掲示板過去ログ

部分PostBack時のDataBind

環境/言語:[ASP.NET3.5,VB.NET,VisualStudio2008 ]
分類:[ASP.NET]

お世話になります。
ASP.NET 3.5
VisualStudio2008
にて開発しております。

-------------------------------
|【検索条件】 |
| |
| コードTextBox 名称Label |
| 検索ボタン |
| |
| --------------------------- |
| | 一覧表(GridView) | |
| |ハイパーリンク | |
| | | |
| | | |
| --------------------------- |
| |
--------------------------------

上のような一覧検索画面を作成しました。
主な機能としては、
検索ボタンクリックで、TextBoxの検索条件で検索し、結果をGridViewで表示。
一覧表内の任意の行を選択で、明細画面へ遷移。

また、コードTextBoxに値が入力されると、DB検索を行い、名称Labelを設定します。
ここのみ、UpdatePanelを利用し、部分PostBackで実装しています。

だいたい正常に動いているのですが、以下手順で不具合が発生しております。
@コードTextBoxに「A」と入力し、検索ボタンクリック
AコードTextBoxに「B」と入力し、検索ボタンは押さない
B一覧表の「A」をクリックすると、一覧表に表示されていない「B」の明細画面へ遷移する。

デバッグしてみたところ
Aで部分PostBackした際に再度検索処理(Bind)が流れているのですが、GridViewはUpdatePanelに入れていないため、書き換わっていません。(書き換えたくありません)
その為、クライアント側で表示されているGridViewとサーバー側のGridViewが異なっているようです。

お聞きしたいこととしては
1.Aで再度検索処理(Bind)をしたくないのですが、可能でしょうか
2.クライアント側に表示されている値を優先したいのですが、可能でしょうか

UpdateModeはConditionalです。
GridViewの選択行はSelectedDataKeyで拾っています。

お手数をお掛けしますが何卒よろしくお願いいたします
■No27190に返信(麦茶さんの記事)

> 1.Aで再度検索処理(Bind)をしたくないのですが、可能でしょうか

おそらくは可能だと思います。
コードで明示的に Bind を呼んでいるのであれば呼ばないようにして、
暗黙的に Bind が呼ばれるようであれば Bind を呼ぶ条件というのがあるはずなので
その条件を不成立にするとよいのかなと思います。

DataBind と言いますか検索処理はどのように実装されているのでしょうか。
DataSource コントロールを利用されていたりしますか?

> 2.クライアント側に表示されている値を優先したいのですが、可能でしょうか

1が可能であればできるように思います。
お世話になります。

検索処理ですが、ObjectDataSourceを利用しています。

Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSearch.Click
If Page.IsValid Then
GridView1.DataSourceID = ObjectDataSource1.ID
GridView1.DataBind()
End If
End Sub

部分PostBack時は、.DataBind()は流れておりません。

よろしくお願いいたします
■No27194に返信(麦茶さんの記事)

> 部分PostBack時は、.DataBind()は流れておりません。

> Aで部分PostBackした際に再度検索処理(Bind)が流れている
ということに鑑みると部分ページレンダリング時に明示的に DataBind は呼ばないけれども
暗黙的に DataBind されるということですか。

> Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSearch.Click
>   If Page.IsValid Then
>     GridView1.DataSourceID = ObjectDataSource1.ID
>     GridView1.DataBind()
>   End If
> End Sub

検索時のコードにおいて TextBox の値を参照していないようですが
ObjectDataSource で ControlParameter などを利用していらっしゃるのでしょうか?
お世話になります。

>>Aで部分PostBackした際に再度検索処理(Bind)が流れている
> ということに鑑みると部分ページレンダリング時に明示的に DataBind は呼ばないけれども
> 暗黙的に DataBind されるということですか。
⇒はい。
 GridViewの項目のText='<% Bind("項目名") %>'などが最後に流れています。

> 検索時のコードにおいて TextBox の値を参照していないようですが
> ObjectDataSource で ControlParameter などを利用していらっしゃるのでしょうか?
>
⇒はい。
 以下の様にObjectDataSourceを使用しております。
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
OldValuesParameterFormatString="original_{0}" SelectMethod="GetData"
TypeName="SampleDSTableAdapters.AAATableAdapter">
<SelectParameters>
<asp:ControlParameter ControlID="TextBox1" Name="項目名"
PropertyName="Text" Type="String" ConvertEmptyStringToNull="false" />
</SelectParameters>
</asp:ObjectDataSource>

情報が小出しになってしまい申しわけございません。
引き続きよろしくお願いいたします
2010/08/18(Wed) 14:32:40 編集(投稿者)

■No27197に返信(麦茶さんの記事)

> <asp:ControlParameter ControlID="TextBox1" Name="項目名"
>   PropertyName="Text" Type="String" ConvertEmptyStringToNull="false" />

ControlParameter が自身のバインド先である TextBox1.Text の値が変わったことを
検出して自動的に ObjectDataSource の DataBind を呼び出すのではないかと思います。

対応としては部分ページレンダリング時に TextBox1.Text の値の変化を検出しないようにする
とよいわけなので

ControlParameter を Parameter に置き換えて

<asp:Parameter Name="項目名" Type="String" />

btnSearch.Click 時に Parameter に値をセットするというやり方が考えられます。

Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSearch.Click
  If Page.IsValid Then
    Dim parameter As Parameter = ObjectDataSource1.SelectParameters(0)
    parameter.DefaultValue = TextBox1.Text
  End If
End Sub

丁寧に実装するならば以下のリンク先のような感じで Parameter の派生クラスを作成したほう
がよいのかなと思います。

Parameter クラス
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.parameter.aspx
お世話になります。

ご丁寧にご説明頂き有難うございます。
至極納得致しました。
btnSearch.Click 時に Parameter に値をセットの方法で実装してみたところ、
正常に動作していることを確認致しました。

msdnの方も拝見させて頂きました。
派生クラスでの丁寧な実装にもチャレンジしてみたいと思います。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板