5

私はリストボックスコントロールを持っています:


<asp:ListBox runat="server" id="lbox" autoPostBack="true" />

コード ビハインドは次のようになります。


private void Page_Load(object sender, System.EventArgs e)
{
    lbox.SelectedIndexChanged+=new EventHandler(lbox_SelectedIndexChanged);
    if(!Page.IsPostBack)
    {
        LoadData();     
    }
}
private LoadData()
{
    lbox.DataSource = foo();
    lbox.DataBind();
}
protected void lboxScorecard_SelectedIndexChanged(object sender, EventArgs e)
{
    int index = (sender as ListBox).selectedIndex;
}

私の問題は、私のページがポストバックを受信したとき (ユーザーがリストボックスで選択を行ったとき)、選択が常にリストボックスの最初の項目に「ジャンプ」するため、コールバック関数のインデックス変数が常に 0 になることです。

これはビューステートの問題である可能性がありますか?選択インデックスがポストバックを通じて残るようにするにはどうすれば修正できますか?

進行中の ajax はありません。これは .NET 1.0 です。

ありがとう。

編集 1 JohnIdol は一歩近づきました。データソースを元の DataTable から ArrayList に切り替えると、すべてが正常に機能します...何が原因でしょうか?

編集 2私の DataTable には同じ値が複数あることが判明したため、インデックスは同じ値を持つすべてのアイテムと同じように扱われました...助けてくれた人に感謝します!

4

9 に答える 9

10

The real issue here is order of events. When you databind in page_load you overwrite the posted data, thats why the selection is not set in the listbox. You can easily overcome this by moving the binding logic to Page_Init.

于 2008-12-10T19:12:21.983 に答える
2

foo() 関数呼び出しの出力は何ですか?

リストボックスに手動でデータを入力すると、インデックスを好きなように設定できます(たとえば、すべて0)-特定の状況(インデックスを指定するもの)で特定のdataSourceを設定すると、同じことが起こります。すべてのアイテム インデックスが 0 の場合、結果として SelectedIndexChanged イベントが発生せず (インデックスは変更されません!)、すべてが台無しになります: ポストバック選択では、リストの最初のアイテムに戻ります。

これはそれを説明するでしょう-私は他に何も考えられません-それは.NET 2.0でうまく機能しています。

問題を再現できる唯一の方法は、すべてのインデックスを 0 に設定することです。

ListBox にウォッチを追加し、実行時にインデックスをチェックして、それらがすべてゼロでないことを確認します。

于 2008-12-03T20:39:49.520 に答える
2

リストボックスの項目が同じ場合、選択したインデックスは 0 に設定されます。それを修正するには、異なる値を に設定し、同じitem.valueままにします。その後、item.text選択したインデックスが適切に表示されます。

于 2011-11-24T08:59:56.417 に答える
1

Page_LoadではなくPage_Initにデータをロードします。PostBackで使用できるようにするには、Page_init中にデータを入力する必要があります。

于 2011-06-29T22:47:03.823 に答える
1

DropDownLists/ListBoxes のデータバインディングは、しばしば間違った値にバインドされるため、面倒です。

私は DataBind() の使用をあきらめ、Foreach ループの使用に頼っています。

foreach (Item i in DataSet)
{
     listBox.Items.Add(etc);
}
于 2008-12-03T21:09:56.213 に答える
0

私にとってもうまくいきます。あなたの foo() は毎回同じ値を返しますか?

余談ですが、可能であれば、(GET だけでなく毎回) OnInit でデータバインディングを行う必要があります。base.OnInit(...) への呼び出しの前にそれを行うと、リストボックスの内容をビューステートとの間でシリアライズおよびデシリアライズし、ネットワークを介してクライアントに送信する必要がなくなります (はい、ヒットしますただし、ローカル サブネット上にあるシステム、または同じマシン上にあるシステムにアクセスすることになります.さらに、データベースは結果をキャッシュする可能性があります)。

高性能の Web サイトを構築する場合は、ViewState の使用方法を詳しく調べる必要があります。この記事を強くお勧めします: 本当にViewState を理解する

于 2008-12-03T21:08:33.220 に答える
0

ページの読み込みごとに新しいイベントハンドラを作成しているように見えます。これが問題を引き起こしている可能性があります。イベントハンドラーを宣言的にアタッチしない理由:

<asp:ListBox runat="server" id="lbox" autoPostBack="true" OnSelectedIndexChanged="lbox_SelectedIndexChanged" />

また、キャストする代わりに、コントロールを直接参照してみませんか?

protected void lbox_SelectedIndexChanged(object sender, EventArgs e)
{
    int index = lbox.selectedIndex;
}
于 2008-12-03T20:04:29.170 に答える
-1

ページ/ユーザー コントロールの OnInit イベントなど、以前にデータをロードすることを考えましたか。これは、ポストバック データがロードされる前、つまり on-change が処理される前に発生しますか? 私はそれがうまくいくと信じています - しかし、あなたはビューステートをオフにしたいかもしれません!

于 2008-12-03T20:24:28.957 に答える
-2

それが違いを生むかどうかはわかりませんが、通常、コードビハインドではなくフロントページのイベントにコントロールをアタッチします。あなたの例では、私はやったでしょう:

<asp:ListBox runat="server" id="lbox" autoPostBack="true" OnSelectedIndexChanged="lboxScorecard_SelectedIndexChanged"  />

それ以外は、ViewState が有効になっていることを確認します。ViewState は、コントロール、ページ、さらにはサイト レベルでオフにすることができます。

于 2008-12-03T20:00:10.427 に答える