2

Startたとえば、レンダリングする必要がある最初のレコードを示すために、さまざまなプロパティを持つページャー コントロールを作成しました。これは、実際にレコードのリストをレンダリングする別のコントロールに埋め込まれています。プロパティのゲッターとセッターは、ViewState を使用して値を保持および取得します。

ページャ内のリンクは、page_load 中に動的に作成されます。それぞれのリンクで、anchor.ServerClick デリゲートは、ページャー コントロールの Start プロパティを設定するラムダに関連付けられています。

ページをデバッグすると、Start プロパティが実際に更新されていることがわかりますが、変更された値は、おそらく ViewState メカニズムを介して永続化された、次回ページを読み込むときにのみ利用可能です。

これが実際に意味することは、埋め込みコントロールがこれらのプロパティの更新された値を時間内に認識せず、正しいリストをレンダリングできないということです。ビジターがページャーのプロパティを使用する前に、訪問者がクリックして更新するようにするにはどうすればよいですか?

編集:いくつかのコードを追加する

メイン コントロールの Page_Load から呼び出され、ページャーのプロパティを参照するループがあります。このループは、表示される項目を決定します。この時点までにコントロール プロパティが更新されていれば、正しいレコードが表示されますが、そうではありません。

for (int i = pager.Start - 1 ; 
          i < queryResults.Count() && i <= (pager.Start + pager.PageSize); i++) {

Page_Load からも呼び出されるページャー コントロールには、子コントロールを追加してデリゲートを接続する次のようなコードがあります。

HtmlAnchor a = new HtmlAnchor();
a.HRef = "#";
a.InnerText = page.ToString();
newStartNumber = ((page - 1) * this.PageSize) + 1;
a.Attributes["data-start"] = newStartNumber.ToString();
a.ServerClick += (sender, e) => 
      { this.Start = int.Parse(((HtmlAnchor)sender).Attributes["data-start"]); };
li.Controls.Add(a);
ul.Controls.Add(li);

したがって、これらのアンカーがクリックされると、ページャーの Start プロパティが更新されますが、手遅れです。

4

1 に答える 1

0

私の知る限り、これらのコード部分は問題ないようです。

あなたの Page プロパティは次のようになります。

public int Page
{
    get { return ViewState["Page"] == null ? 0: (int)ViewState["Page"]; }
    set { ViewState["Page"] = value; }
}

この :

for (int i = pager.Start - 1 ; 
          i < queryResults.Count() && i <= (pager.Start + pager.PageSize); i++) {

親コントロールの preRender にあります。

この :

HtmlAnchor a = new HtmlAnchor();
a.HRef = "#";
a.InnerText = page.ToString();
newStartNumber = ((page - 1) * this.PageSize) + 1;
a.ServerClick += (sender, e) => { this.Start = newStartNumber; };
li.Controls.Add(a);
ul.Controls.Add(li);

ページャー コントロールのページロード (または初期化) にあります。(data-start 属性は必要ないかもしれません)

HtmlAnchors に ID を指定する必要があります。

于 2013-02-15T09:17:10.570 に答える