2011-01-13 22 views
6

私はListBoxをコードビハインドに追加しています。私が持っている問題は、ListBoxが選択された項目を見ていないということです。 DropDownListがAutoPostBackをtrueに設定するように、ユーザーがDropDownListから何を選択するかによって、ListBoxに動的に値が設定されます。私はこれがどういうわけか問題を引き起こしていると思います。ListBoxは選択されていないアイテムを取得していません

私のSelectedIndexChangedメソッドは、DropDownListの項目が選択されるたびに使用され、PopulateListBoxというメソッドを呼び出します。ここでは、これらのメソッドは次のようになります。ここでは、それは価値がある何のため

protected void SelectedIndexChanged(object sender, EventArgs e) 
{ 
    string typeStr = type.SelectedItem.Text; 
    MyType = Api.GetType(typeStr); 
    PopulateListBox(); 
} 

private void PopulateListBox() 
{ 
    listbox.Items.Clear(); 
    foreach (PropertyInfo info in MyType.GetProperties()) 
     listbox.Items.Add(new ListItem(info.Name)); 
} 

のDropDownListとListBoxコントロールされています

<asp:DropDownList runat="server" ID="type" width="281px" OnSelectedIndexChanged="SelectedIndexChanged" AutoPostBack="true" /> 

<asp:ListBox runat="server" ID="listbox" width="281px" height="200px" selectionmode="Multiple" /> 

私がやろうとしていますどのようなことは(文字列が選択されている文字列のリストを追加することですitems)をセッション変数として追加することができます。リストがセッションに追加された後、ボタンは新しいページにリダイレクトされます。デバッガでは、文字列のリストは、私がセッションに追加するポイントで空です。

listbox.GetSelectedIndices()は何も返しません。

更新

私はDropDownListコントロールの変更を行わない場合、私は、選択した項目にアクセスすることができます。 ListBoxは最初はページの読み込み時に読み込まれ、選択すると認識されます。 DropDownListから何かを選択し、ListBoxが再投入された場合、選択は認識されません。

私のPage_Loadメソッドは2つのことしか行いません。それはこのようになりますこれは、私のAPI変数を初期化し、PopulateDropDownを呼び出します。

private void PopulateDropDown() 
{ 
    foreach (Type t in Api.GetAllTypes()) 
     type.Items.Add(new ListItem(t.Name)); 
    string typeStr = type.Items[0].Text; 
    Type = Api.GetType(typeStr); 
    PopulateListBox(); 
} 
+0

ただし、リストボックスで選択した項目が表示されない場合は、ドロップダウンリストで選択を変更するときは?または、ポストバックを実行する他のコントロールがありますか? – dzendras

+0

@dzendras:これについては、下のポストを更新しました。 –

+0

いつリストボックスにアクセスしますか? PageLoad?あなたがそれにアクセスする場所がASP.NETページのライフサイクルに従ってOKであるかどうかをチェックします(リクエストコントロールの処理の初期段階ではプロパティが設定されていません)。また、ページライフサイクルの早い段階でリストボックスをクリアしていないかどうか確認してください。 – dzendras

答えて

13

問題は、あなたがリストボックスをクリアし、それを再生成しPopulateListBox()を呼び出し、すべての単一のPage_Load()、上PopulateDropDown()を呼び出すことです。リストボックスを消去すると、選択がクリアされます。

Page_Load()PopulateDropDown()への電話を次のコードに置き換える必要があります。あなたが気づいていないと思う問題は、ページがすべてのポストバックにロードされていることです。ページライフサイクルでは、イベントの前にページの読み込みが発生します。したがって、ドロップダウンアイテムを選択すると、最初にPage_Load()イベントが実行されます(間接的にLoadListBoxメソッドが実行され、選択がクリアされます)。次のコードは、最初にページがロードされるときにドロップダウンリストに値を設定します。のみです。あなたは、負荷のドロップダウンメソッドを使用しているところはどこでも、他に同じことをしてください:

protected void Page_Load(object sender, EventArgs e) 
{ 
    // Do your API code here unless you want it to occur only the first 
    // time the page loads, in which case put it in the IF statement below. 
    if (!IsPostBack) 
    { 
     PopulateDropDown(); 
    } 
} 

IsPostBackプロパティページが(「偽」)を初めてロードするかのようにしているため、サーバー側のコードが実行されているかどうかを示すブール値を返します。ポストバック( "true")。

他のところで述べたように、複数の選択された値を持つ可能性のあるリストボックスは、1つの選択肢の可能性のあるリストボックスとは異なる扱いをしなければならないことに注意してください。listbox.SelectedItemを参照するのではなく、しないでください。

foreach (ListItem item in lbFullNames) 
{ 
    if (item.Selected) 
    { 
     // TODO: Whatever you are doing with a selected item. 
    } 
} 
+0

ああ、感謝ジャスティン。 DropDownListは、AutoPostBackがtrueに設定されているため、ポストバックのみを呼び出します。私はあなたの解決策を明日撮影し、報告する。 –

+0

はい、AutoPostBackをfalseに設定すると、インデックスを変更するときにC#コードが実行されません。つまり、リストボックスは再作成されません。 –

1

私はまた、あなたがリストボックスサーバ側を無効にした場合、その後、あなたが得ることができない、次のようなコードを使用して、リストボックスを有効にするには、クライアント側のコードを使用することを発見しました選択された項目のサーバー側。

$('.css-class-assigned-to-listbox').attr('disabled', ''); 

修正はクライアント側のコードを使用して(上記参照)それは、サーバー側(デフォルト)有効になって、それを無効にする(ブローを参照)、またはそれを有効にしてくださいすることです。

$('.css-class-assigned-to-listbox').attr('disabled', 'disabled'); 
関連する問題