[英]ListBox not getting selected items
我有一個ListBox,我將ListItems添加到代碼隱藏中。 我遇到的問題是ListBox沒有看到所選項目。 我根據用戶從DropDownList中選擇的內容動態填充ListBox,因此DropDownList將AutoPostBack設置為true。 我認為這是以某種方式導致問題。
我的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" />
我想要做的是在單擊提交按鈕時添加一個字符串列表(作為所選項的字符串)作為會話變量。 將List添加到會話后,該按鈕將重定向到新頁面。 在調試器中,字符串列表在我將其添加到會話時是空的。
listbox.GetSelectedIndices()
返回任何內容。
更新
如果我沒有在DropDownList中進行更改,我可以訪問所選項目。 ListBox最初是在頁面加載時填充的,如果我進行選擇,則會識別它們。 如果我從DropDownList中選擇一些內容並重新填充ListBox,則無法識別選擇。
我的Page_Load
方法只做兩件事。 它初始化我的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();
}
問題是你在每個調用PopulateDropDown()
Page_Load()
上調用PopulateListBox()
,它會清除列表框並重新填充它。 通過清除列表框,您可以清除選擇。
您需要使用以下代碼替換對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返回一個布爾值,指示服務器端代碼是否正在運行,因為頁面是第一次加載(“false”)或作為回發(“true”)。
正如我在其他地方所說的那樣,請記住,具有多個所選值的潛在列表框必須以不同於具有單個選擇潛力的列表框進行處理。 不要引用listbox.SelectedItem
,而是:
foreach (ListItem item in lbFullNames)
{
if (item.Selected)
{
// TODO: Whatever you are doing with a selected item.
}
}
我還發現,如果你禁用ListBox服務器端,然后使用客戶端代碼使用如下代碼啟用列表框,那么你無法獲得所選項目服務器端。
$('.css-class-assigned-to-listbox').attr('disabled', '');
修復只是為了確保它在服務器端啟用(默認),然后禁用它(請參閱打擊)或使用客戶端代碼啟用它(見上文)。
$('.css-class-assigned-to-listbox').attr('disabled', 'disabled');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.