我有一个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();
}
答案 0 :(得分:13)
问题是,您在每个PopulateDropDown()
上调用Page_Load()
,PopulateListBox()
会调用PopulateDropDown()
,这会清除列表框并重新填充它。清除列表框后,清除选择。
您需要使用以下代码替换Page_Load()
中Page_Load()
的来电。我认为你没有意识到的问题是每次回发都会加载页面 - 而在页面生命周期中,页面加载发生在事件之前。因此,通过选择下拉项,首先执行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();
}
}
事件(间接执行LoadListBox方法,清除选择)。第一次加载 页面时,以下代码将填充下拉列表。在使用加载下拉方法的任何其他地方保持相同:
listbox.SelectedItem
IsPostBack返回一个布尔值,指示服务器端代码是否正在运行,因为页面是第一次加载(“false”)还是回发(“true”)。
正如我在其他地方所说的那样,请记住,具有多个选定值的列表框的处理方式必须与可能具有单个选择的列表框不同。不要引用foreach (ListItem item in lbFullNames)
{
if (item.Selected)
{
// TODO: Whatever you are doing with a selected item.
}
}
,而是引用:
{{1}}
答案 1 :(得分:1)
我还发现如果你禁用ListBox服务器端,然后使用客户端代码使用如下代码启用列表框,那么你就无法获得所选项目的服务器端。
$('.css-class-assigned-to-listbox').attr('disabled', '');
修复只是为了确保它在服务器端启用(默认设置),然后禁用它(请参阅打击)或使用客户端代码启用它(见上文)。
$('.css-class-assigned-to-listbox').attr('disabled', 'disabled');