Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表框未获取所选项目_C#_Asp.net_Listbox_Drop Down Menu - Fatal编程技术网

C# 列表框未获取所选项目

C# 列表框未获取所选项目,c#,asp.net,listbox,drop-down-menu,C#,Asp.net,Listbox,Drop Down Menu,我有一个列表框,我正在代码隐藏中向其中添加列表项。我遇到的问题是列表框没有看到所选的项目。根据用户从DropDownList中选择的内容,动态填充列表框,因此DropDownList的AutoPostBack设置为true。我认为这是造成问题的原因 我的SelectedIndexChanged方法调用名为PopulateListBox的方法,该方法在选择DropDownList中的项目时使用。以下是这些方法的外观: protected void SelectedIndexChanged(obje

我有一个列表框,我正在代码隐藏中向其中添加列表项。我遇到的问题是列表框没有看到所选的项目。根据用户从DropDownList中选择的内容,动态填充列表框,因此DropDownList的AutoPostBack设置为true。我认为这是造成问题的原因

我的
SelectedIndexChanged
方法调用名为
PopulateListBox
的方法,该方法在选择DropDownList中的项目时使用。以下是这些方法的外观:

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" />

问题在于,您在每个
页面上调用
PopulateDropDown()
,该页面调用
PopulateListBox()
,从而清除列表框并重新填充它。通过清除列表框,可以清除所选内容

您需要用以下代码替换对
页面中
PopulateDropDown()
的调用。我认为您没有意识到的一个问题是,每次回发时都会加载页面——在页面生命周期中,页面加载发生在事件之前。因此,通过选择一个下拉项,您首先执行
Page\u 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”)

正如我在其他地方所说的,请记住,具有多个选定值潜力的列表框的处理方式必须与具有单个选定值潜力的列表框的处理方式不同。不要引用列表框。选择编辑项,而是:

foreach (ListItem item in lbFullNames)
{
    if (item.Selected)
    {
        // TODO: Whatever you are doing with a selected item.
    }
}

我还发现,如果禁用列表框服务器端,然后使用客户端代码来启用列表框,则无法从服务器端获取所选项目

$('.css-class-assigned-to-listbox').attr('disabled', '');
修复方法只是确保在服务器端启用它(默认设置),然后禁用它(请参见blow)或使用客户端代码启用它(请参见上文)

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

您何时访问列表框?页面加载?根据ASP.NET页面生命周期检查访问它的位置是否正常(在处理请求的早期阶段,控件未设置其属性)。还要检查是否在页面生命周期的早期未清除列表框。@dzendras:我在我的按钮单击方法中访问列表框。抱歉,但我需要问:在访问SelectedDices之前是否检查了PopulateListBox方法是否未执行?(方法中的断点会很好)如果在页面加载时调用PopulateListBox,是否将其限制为!我回来了?否则,您将清除列表框并重新填充它。好的,但是您确实没有回答我关于您是否在:if(!IsPostBack){}中包含对该方法的引用的问题,因此请发布您的整个页面加载方法。啊,谢谢Justin。DropDownList只调用回发,因为它的AutoPostBack设置为true,对吗?我明天会给你的解决方案一次机会,然后再报告。是的,但是如果你将AutoPostBack设置为false,那么当你更改索引时,C代码将不会执行,这意味着列表框将不会重新填充。
$('.css-class-assigned-to-listbox').attr('disabled', 'disabled');