C# ASP.NET DropDownList SelectedIndex在第一个元素上未更改

C# ASP.NET DropDownList SelectedIndex在第一个元素上未更改,c#,asp.net,C#,Asp.net,我过去认为我的c#编程还不算太差,但今天我严肃地质疑我的头脑,一些如此小的东西正在打败我 我正试图让一个下拉列表表现得更好,但我们今天没有进展。我在ascx控件中有一个简单的DropDownList,它被动态加载到aspx页面中 <asp:DropDownList ID="ddl_SortBy" runat="server" AutoPostBack="true"> <asp:ListItem Value="0">Sort Alphabeti

我过去认为我的c#编程还不算太差,但今天我严肃地质疑我的头脑,一些如此小的东西正在打败我

我正试图让一个下拉列表表现得更好,但我们今天没有进展。我在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>
我永远无法获取触发所选索引更改事件的第一项,因为未调用SearchDirectory()函数。我可以理解,当控件加载第一项时,可能会选择第一项,因此在选择时,索引实际上不会改变

我尝试将所选项目索引设置为-1,并在页面加载时清除selection(),但没有成功


有什么想法吗?谢谢

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

this.ddl_SortBy.SelectedIndex = -1;
因此,在回发检查中也要这样做:

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

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

<asp:ListItem Value="-1">(choose how to sort)</asp:ListItem>
(选择如何排序)
这样,当用户选择所需的排序顺序时,所选索引将更改,事件将触发


首先删除对代码隐藏下拉列表的额外修改。

将事件处理程序分配从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(); 
}

我的母版页视图状态已关闭,这就是它无法工作的原因。虽然这不是我想允许的

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

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

        // search directory
        SearchDirectory();
    }
现在效果非常好:)

谢谢大家。

我发现自己也需要像大家期望的那样在页面加载上执行更改事件。。问题是,我在ASP.NET之前就意识到要将一些ListItems设置为0

因此,如果我放置一些类似这样的东西。ddl_SortBy。SelectedIndex=-1,在这之后,调试器仍然显示0。。。所以它从不打开-1,也从不执行更改事件。这就像ASP.NET在未选择任何内容(-1)时始终将第一个ListItem视为所选项目一样,因此强制它执行-1或0从不在第一次调用更改事件

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

因此,我认为我们必须强制要求进行以下活动:
ddl(按所选索引排序)已更改(null,null)

我还尝试使用
OnSelectedIndexChanged
将事件调用放在DropDownList上,并删除页面加载中的前两行,结果相同。您在每个页面请求上做的第一件事是将所选索引设置为静态值。就代码的其余部分而言,它永远不会改变。您希望发生什么?您是否希望事件在初始加载时发生?或者您是否遇到“重新选择”初始项不起作用的问题?否,在页面加载时,它可以正常工作,因为它将只使用
SortBy
定义的值0,然后当选择dropdownlist中的第二个选项时,它可以正常工作,但在之后选择第一个选项时,不会发生任何情况,它只是发回,什么也不做。同样的问题也是如此。@danrichardson-你从另一个页面复制/粘贴了控件吗?如果是,请删除它,保存文件并从头开始键入。并将事件分配保存在OnInit中,它应该在那里。不,无论如何都是从头开始编写的。@danrichardson-创建一个新项目并将下拉列表添加到那里。没有母版页和静态项。在OnInit中添加事件处理程序,看看是否有效。如果是这样的话,您当前的页面可能有问题。尝试“清理”项目,删除临时文件,重新编译。可能有助于清理它。如前所述,我当时正抓紧吸管将其移除,同样的事情也会发生。我注意到aspx页面所处的母版页的视图状态已关闭,我已打开它,它现在可以工作了。。。现在的问题是我不希望我的站点中所有页面的视图状态都处于打开状态:-/不过谢谢Tim@danrichardson:我假设usercontrol加载的动态部分导致了此问题。因此,您应该向我们展示如何将usercontrol添加到页面中。您是否使用与以前相同的id在每次连续回发时重新创建它?编辑:我很高兴听到这个消息。它是从另一个用户控件添加的,该控件正在以相同的方式加载。像这样
System.Web.UI.UserControl ctl=((System.Web.UI.Page)HttpContext.Current.Handler).LoadControl(CntrlSrc)作为System.Web.UI.UserControl-我对以相同方式加载的联系人表单控件没有任何问题,只是将此下拉列表添加到控件中的占位符控件中,它加载到控件中并不是一个很好的解决方案,因为这意味着更改我想要显示的内容,这与我希望代码默认执行的操作相矛盾,即按第一项排序。
protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
            SortBy = Convert.ToInt16(Request.Form[this.ddl_SortBy.UniqueID]);

        // search directory
        SearchDirectory();
    }