加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – ListBox未获取所选项目

发布时间:2020-12-15 18:20:47 所属栏目:百科 来源:网络整理
导读:我有一个ListBox,我将ListItems添加到代码隐藏中.我遇到的问题是ListBox没有看到所选项目.我根据用户从DropDownList中选择的内容动态填充ListBox,因此DropDownList将AutoPostBack设置为true.我认为这是以某种方式导致问题. 我的SelectedIndexChanged方法(每
我有一个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();
}

解决方法

问题是你在每个调用PopulateListBox()的Page_Load()上调用PopulateDropDown(),它会清除列表框并重新填充它.通过清除列表框,您可以清除选择.

您需要使用以下代码替换对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.
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读