【问题标题】:ListBox not getting selected items列表框未获取所选项目
【发布时间】: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


【解决方案1】:

问题是您在每个Page_Load() 上调用PopulateDropDown(),它调用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.
    }
}

【讨论】:

  • 啊,谢谢贾斯汀。 DropDownList 只调用回发,因为 AutoPostBack 设置为 true,对吧?我明天会给你的解决方案试一试,然后报告。
  • 是的,但是如果您将 AutoPostBack 设置为 false,那么当您更改索引时,C# 代码将不会执行,这意味着列表框不会重新填充。
【解决方案2】:

我还发现,如果您禁用 ListBox 服务器端,然后使用客户端代码使用如下代码启用列表框,那么您无法获取所选项目服务器端。

$('.css-class-assigned-to-listbox').attr('disabled', '');

修复只是确保它在服务器端启用(默认),然后禁用它(见下注)或使用客户端代码启用它(见上文)。

$('.css-class-assigned-to-listbox').attr('disabled', 'disabled');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2012-11-16
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多