我有一个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));
}
对于它的 Value ,这里是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()
什么都不返回 .
Update
如果我没有在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();
}
2 回答
问题是你在
Page_Load()
上调用PopulateDropDown()
,它调用PopulateListBox()
,它清除列表框并重新填充它 . 通过清除列表框,您可以清除选择 .您需要使用以下代码替换
Page_Load()
中对PopulateDropDown()
的调用 . 我认为你没有意识到的问题是每次回发都会加载页面 - 而在页面生命周期中,页面加载发生在事件之前 . 因此,通过选择下拉项,首先执行Page_Load()
事件(间接执行LoadListBox方法,清除选择) . 以下代码将在第一次加载页面时填充下拉列表 . 在使用加载下拉方法的任何其他地方保持相同:IsPostBack返回一个布尔值,指示服务器端代码是否正在运行,因为页面是第一次加载(“false”)或作为回发(“true”) .
正如我在其他地方所说的那样,请记住,具有多个所选值的潜在列表框必须以不同于具有单个选择潜力的列表框进行处理 . 不要参考
listbox.SelectedItem
,而是:我还发现,如果你禁用ListBox服务器端,然后使用客户端代码使用如下代码启用列表框,那么你无法获得所选项目服务器端 .
修复只是为了确保它在服务器端启用(默认),然后禁用它(请参阅打击)或使用客户端代码启用它(见上文) .