我的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(); }
解决方法
您需要使用以下代码替换对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. } }