【发布时间】:2011-06-08 20:23:55
【问题描述】:
我有一个 ListBox,我将 ListItems 添加到代码隐藏中。我遇到的问题是 ListBox 没有看到选定的项目。我根据用户从 DropDownList 中选择的内容动态填充 ListBox,因此 DropDownList 的 AutoPostBack 设置为 true。我认为这是导致问题的原因。
My SelectedIndexChanged method, which is used whenever an item in the DropDownList is selected, calls a method called 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" />
我要做的是在单击提交按钮时添加一个字符串列表(字符串是所选项目)作为会话变量。将列表添加到会话后,该按钮将重定向到新页面。在调试器中通过,字符串列表在我将其添加到会话时为空。
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();
}
【问题讨论】:
-
什么时候访问列表框?页面加载?根据 ASP.NET 页面生命周期检查您访问它的位置是否正常(在处理请求控件的早期阶段没有设置它们的属性)。还要检查您是否没有在页面生命周期的早期清除列表框。
-
@dzendras:我在按钮单击方法中访问 ListBox。
-
对不起,但我需要问一下:您是否在访问 SelectedIndices 之前检查了 PopulateListBox 方法是否未执行? (方法中的断点会很好)
-
如果在页面加载时调用 PopulateListBox,您是否将其限制为 !IsPostBack ?否则,您将清除列表框并重新填充它。
-
好的,但是您确实没有回答我的问题,即您是否在 an: if (!IsPostBack) { } 中包含对该方法的引用,所以请发布您的整个 Page_Load 方法。
标签: c# asp.net listbox drop-down-menu