2011-01-18 13 views
0

複数選択オプションがtrueで、選択したインデックスが変更されるたびにポストバックを行う必要があるC#、.net、System.Web.UI.WebControls.Lisboxを参照。複数選択リストボックスのSelectedIndexを最後に選択したアイテムに変更する

[SelectedIndex/SelectedItem/SelectedValue]は、常にの最初の選択項目の値になります。 2番目の項目である3番目の項目をクリックすると、SelectedIndexが変更されず、リストボックスがリロードされ、選択された項目の最も高い位置にスクロールされます。

+0

私が持っている最も近い解決策は、最後にクリックしたアイテムを追跡するためのグローバルなjavascript varです。しかし、これは理想的ではありません。プレレンダリング時に、リストボックスは最も上位に選択された項目にジャンプします(javascriptが実行される前に)。 – bcm

+0

また、SelectedIndexChange関数をデバッグすると、選択されたアイテムのリストがキャッシュされますが、最後に追加されたアイテムの表示はありません。 – bcm

+0

私はバックエンドでこれを行う実際の方法はないと思いますが、ポストバックはListboxのtrueオプションです。もしそうなら、このスレッドを閉じます。 – bcm

答えて

0

たびに移入していない限り、このコントロールは懸念しているこれを行う方法はありませんことを確認してください。

+0

bullshit :)私の返事を見てください。私はそれを試していないが、原則としてそれは動作するはずです。がんばろう。 – Triynko

0

ブランドン - あなたがリストボックスをロードしている場所でコードを共有できますか? (ポストデータが処理された後に)戻ってポストにリストボックスをリロード

  1. なしがあるように、動的後半ページのライフサイクルでのリストボックスをロード
  2. :以下は、その選択を保持するためではないのListBoxのためのいくつかの可能性の理由がありますポストバックデータを処理する機会
  3. クライアントIDが変更されるように(またはポストデータ処理が発生したときに特にClientIDが異なるように)リストボックスを動的にロードする(おそらくテンプレートベースの親)。
+0

リストボックスにその選択が保持されていますが、項目の中で最後にクリックされた項目がどれだけか分かりません。 – bcm

+0

@Brandon、あなたの問題を理解しました。可能な解決策は、以前に選択されたアイテムを追跡して、今変更されたものを判断し、次にJavaスクリプトを使用してコントロールをスクロールすることです。 IMOでは、2つのサイド・バイ・サイド・リスト・ボックスを使用するなど、いくつかの代替UIを検討することをお勧めします。選択可能なオプションを表示する方法と、選択/選択解除する左右の矢印ボタンを使用する方法があります。 – VinayC

+0

残念ながら私は両方のオプションを考慮しました。リストボックスは、削除オプションを持つ並べ替えリストなので、2つの別々のリストボックスに分割することはできません。 javascriptオプションは機能しますが、事前レンダリング後ですので、一番上に選択されたアイテムが1つ、次に一番下のアイテムが選択された場合、リストボックスにジャンプする可能性があります。 – bcm

0

SelectedIndexは、常に選択されている最も低いインデックスを指します。 ListBox.SelectedIndexプロパティの 定義:

は、リスト内の選択した項目の最低序インデックスを取得または設定します。

手動でselectedindexプロパティを設定すると、他のすべての選択が解除され、特定の選択範囲までスクロールする方法が(.netコード内に)ないことは間違いありません。

あなたは何をしようとしているのか分かりませんが、選択したすべてのインデックスをGetSelectedIndices ListBox関数を使用してキャプチャし、以前にキャプチャした選択インデックスと比較して、項目。

+0

選択したすべてのインデックスをキャプチャできますが、リストボックスのクリック+ポストバックの前に以前に選択したインデックスをキャプチャする方法がわかりません。 – bcm

+0

SelectedIndexを手動で設定すると、選択した複数のアイテムが強制的に削除されます。だから、私はこの問題に対する解決策はないと推測しています。本当に長いリストボックスを持っていて、下の項目をクリックすると、選択された項目リストの上位にある選択された項目にポストバックと位置が生じ、最後にクリックされた項目が隠れてしまう可能性があります。 – bcm

+0

2番目のリストボックスを使用して、選択した項目だけを表示することもできます。各SelectedIndexChangedイベントで、2番目のリストを再構築できます。 – jlnorsworthy

0

ブランドンは、あなたがリストボックスにページが読み込まが

+0

私が事前修飾子として言及したように。ポストバックオプション(したがって自動ポピュレーション)は必要であり、ソリューションに対してはtrueに設定されます。 – bcm

+0

リストボックス全体と、自動ポストバックに依存するコントロールをリファクタリングする必要があるかもしれません... – bcm

+0

この問題がポストバックになる前に、ページが戻ってくるたびにリストボックスが再ポップされるようになりました。 – Baharanji

0

これは厳密にはスクロールの問題です。

document.all.getElementById("elementID").scrollTop = VALUE. 

だからポストを行うJavaScriptのハンドラを変更:

は、明示的に、あなたがscrollTopプロパティを設定するためにJavaScriptを使用する必要があるのListBoxのスクロール値(またはそのことについては任意の要素)を制御するために、 "javascript:__ doPostBack(...")のように見えるあなたのリストボックスのために、現在のscrollTop値を取得し、それを隠し変数に保存したカスタム関数への呼び出しで置き換え、元々想定されていたように__doPostBackを呼び出しますto。

往復の後、その隠し値はクライアントに戻って維持されるはずです。したがって、J avaScriptのページ読み込みイベントでは、その隠し値を読み込んでリストボックスのscrollTopに再適用するだけです。リストボックスは、ポストバックが発生する前の位置に正確にスクロールされます。

関連する問題