ASP.NET DropDownList SelectedIndex不会更改第一个元素

时间:2012-07-10 12:19:18

标签: c# asp.net

我曾经认为我的c#编程并不是太糟糕,但今天我正在认真地质疑我的头脑,这么小的东西正在打败我......

我正在尝试让DropDownList表现出来,但我们今天没有开始。我在ascx控件中有一个简单的DropDownList,它被动态加载到aspx页面

<asp:DropDownList ID="ddl_SortBy" runat="server" AutoPostBack="true">             
  <asp:ListItem Value="0">Sort Alphabetically A to Z</asp:ListItem>
  <asp:ListItem Value="1">Sort Alphabetically Z to A</asp:ListItem>
</asp:DropDownList>

和一些代码背后......

    private short SortBy = 0;

    protected void Page_Load(object sender, EventArgs e)
    {
        this.ddl_SortBy.SelectedIndex = -1;
        this.ddl_SortBy.SelectedIndexChanged += new EventHandler(ddl_SortBy_SelectedIndexChanged);

        if (!IsPostBack)
            SearchDirectory();
    }

    public void ddl_SortBy_SelectedIndexChanged(object sender, EventArgs e)
    {
        SortBy = Convert.ToInt16(this.ddl_SortBy.SelectedItem.Value);
        SearchDirectory();
    }

我永远无法获得触发所选索引更改事件的第一项 - 因为未调用SearchDirectory()函数。我可以理解,可能的情况是,当控件加载第一个选择的项目时,所以在选择时,索引实际上并没有改变。

我已尝试将所选项目索引设置为-1,并在页面加载时设置ClearSelection(),但没有运气。

有什么想法吗?感谢

5 个答案:

答案 0 :(得分:6)

您总是在每次回发时将SelectedIndex重置为-1:

this.ddl_SortBy.SelectedIndex = -1;

所以也把它放在回发检查中:

if (!IsPostBack)
{
    this.ddl_SortBy.SelectedIndex = -1;
    SearchDirectory();
}

答案 1 :(得分:1)

我发现自己同样需要在Page_Load上执行更改事件,就像你期望的那样..事情是我在ASP.NET之前认识到将一些ListItem设置为.SelectecIndex为0。

因此,如果我放置一些类似this.ddl_SortBy.SelectedIndex = -1的东西,之后调试器仍会显示0 ...所以它永远不会打开-1并且永远不会执行更改事件。就像在没有选择任何东西(-1)的情况下,ASP.NET总是将第一个ListItem视为选定的ListItem,因此强制它执行-1或0从不在第一个调用change事件。

再搜索一下:“默认值为0,选择列表中的第一项。”

来自http://msdn.microsoft.com/en-us/library/vstudio/system.web.ui.webcontrols.dropdownlist.selectedindex(v=vs.100).aspx所以我认为我们必须强制调用以下事件: ddl_SortBy_SelectedIndexChanged(null,null);

答案 2 :(得分:0)

将事件处理程序赋值从OnLoad移动到OnInit并删除SelectedIndex行。

protected void Page_Init(object sender, EventArgs e)
{
    this.ddl_SortBy.SelectedIndexChanged += new EventHandler(ddl_SortBy_SelectedIndexChanged);
}

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
        SearchDirectory(); 
}

答案 3 :(得分:0)

我的主页面视图状态已关闭,这就是它无法正常工作的原因。虽然这不是我想要的。

我的解决方案是使用Request.Form恢复到真实表单提交数据检索。

protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
            SortBy = Convert.ToInt16(Request.Form[this.ddl_SortBy.UniqueID]);

        // search directory
        SearchDirectory();
    }

现在工作绝对正常:)
谢谢大家。

答案 4 :(得分:-1)

这个简单的解决方法怎么样?将下拉列表中的第一项设置为:

<asp:ListItem Value="-1">(choose how to sort)</asp:ListItem>

这样,当用户选择所需的排序顺序时,所选索引将发生变化并触发事件。

首先从后面的代码中删除额外的小提琴。