2

カスタム データ ソースからのアイテムのかなり大きなリストを表示する (派生) メニュー コントロールがあります。他のコントロールがポストバックで現在の選択を変更するときに、非常に迷惑な「無効または選択できないメニュー項目を選択できません」を回避するために、メニューの ViewState を無効にする必要があります。

残念ながら、メニューの ViewState が無効になっている場合、メニューによって生成されたポストバックはイベントを発生させません。ViewState を有効にすると、OnMenuItemClick イベントが発生します。ViewState を無効にすると、OnMenuItemClick は発生しません。私は困惑しています。

メニューの ViewState をオフにしておく必要があるので、実際のメニューからポストバックを処理するにはどうすればよいですか?

この時点で、Menu の Load イベントを使用し、__EVENTTARGET を解析してそれが Menu であるかどうかを確認し、そこから進むことに傾いています。これにより、技術的には、通常よりも前にポストバック イベントが処理されますが、問題ないと思います。

より良いアイデアはありますか?

4

3 に答える 3

1

はい、ビューステートを使用してバインドされたコントロールを再設定するか、イベントが発生する前にデータバインドするかを選択できます (Page_Load は問題ありません)。

ただし、このポストバックで何も変更されていない場合 (ページの別の場所で変更が発生した場合)、再度バインドする理由はありません。

代わりに、変更する必要があることがわかっている特定のイベントにのみバインドできる場合があります。

于 2008-11-11T09:06:02.617 に答える
0

問題の本質がわかりました。Reflector を使用すると、実際のポストバックを処理してからイベントを発生させる低レベル メソッドの重要な部分を確認できます。

string str = HttpUtility.HtmlDecode(eventArgument);
...
MenuItem item = this.Items.FindItem(str.Split(new char[] { '\\' }), 0);
if (item != null)
    this.OnMenuItemClick(new MenuEventArgs(item));

ご覧のとおり、MenuEventArgs には MenuItem が渡されます。受信した投稿データと一致するアイテムが現在の Items コレクションに見つからない場合、イベントは発生しません。ViewState を無効にすると、メニューには項目がありません (それらは ViewState を使用して再構築されます)。したがって、イベントは発生しません。

これを回避するために、ロード中にまだ更新されていないデータを使用してメニューをビルドするように指示しました (この時点では、最後のリクエストの最後と同じになります)。これは基本的に ViewState からメニューを再構築するのと同じなので、パフォーマンスなどに関して悪いとは思いません。その後、OnMenuItemClick が期待どおりに起動されます。最後に、PreRender 中にメニューをもう一度再構築するように指示します。これにより、ライフサイクルのポストバック処理部分で発生した変更が反映されます。

私はこれに多くの時間を浪費したので、この情報が同様の状況にある他の誰かに役立つことを願っています.

于 2008-10-26T03:40:19.523 に答える