【问题标题】:ASP.NET DropDownList SelectedIndex not changing on first elementASP.NET DropDownList SelectedIndex 在第一个元素上没有改变
【发布时间】:2012-07-10 12:19:17
【问题描述】:

我以前觉得我的 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(),但没有成功。

有什么想法吗?谢谢

【问题讨论】:

  • 我还尝试使用OnSelectedIndexChanged 将事件调用放在 DropDownList 上,并删除 Page_Load 中的前两行,结果相同。
  • 对每个页面请求做的第一件事就是将所选索引设置为静态值。就其余代码而言,它永远不会改变。
  • 您期望发生什么?您是否希望事件在初始加载时发生?或者您是否遇到“重新选择”初始项目不起作用的问题?
  • 否,在页面加载时它正常工作,因为它将只使用SortBy,然后选择下拉列表中的第二个选项时,它可以正常工作,但选择时之后的第一个,什么也没发生,它只是回发,什么也不做。

标签: c# asp.net


【解决方案1】:

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

this.ddl_SortBy.SelectedIndex = -1;

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

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

【讨论】:

  • 如前所述,我一直在用吸管抓住稻草,但移除它也会发生同样的事情。
  • 我注意到 aspx 页面所在的母版页的视图状态已关闭,我已将其打开并且现在可以使用...现在的问题是我不想要视图为我网站中的所有页面声明:-/ 感谢 Tim
  • @danrichardson:我认为你的用户控件加载的动态部分导致了这个问题。因此,您应该向我们展示如何将用户控件添加到页面。您是否在每次连续回发时都使用与以前相同的 id 重新创建它? 编辑:我很高兴听到这个消息。
  • 它是从另一个以相同方式加载的用户控件添加的。就像System.Web.UI.UserControl ctl = ((System.Web.UI.Page)HttpContext.Current.Handler).LoadControl(CntrlSrc) as System.Web.UI.UserControl; - 我对以相同方式加载的联系表单控件没有任何问题,只是这个下拉列表
  • 然后将其添加到它加载到的控件中的占位符控件中
【解决方案2】:

我发现自己同样需要像您期望的那样在 Page_Load 上执行更改事件。问题是我在 ASP.NET 中发现之前将一些 ListItems 设置为 .SelectecIndex 为 0。

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这样做也有同样的问题。
    • @danrichardson - 您是否从另一个页面复制/粘贴了控件?如果是这样,请将其删除,保存文件并从头开始键入。并将事件分配保留在 OnInit 中,这就是它应该在的位置。
    • 不,反正都是从头开始写的。
    • @danrichardson - 创建一个新项目并在那里添加您的下拉菜单。没有母版页和静态项目。在 OnInit 中添加事件处理程序,看看是否有效。如果是这样,则您的当前页面可能有问题。尝试“清理”项目,删除临时文件,重新编译。可能有助于清除它。
    【解决方案4】:

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

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

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

    现在工作得很好:)
    谢谢大家。

    【讨论】:

      【解决方案5】:

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

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

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

      首先从后面的代码中删除对下拉菜单的额外摆弄。

      【讨论】:

      • 不是一个很好的解决方案,因为它意味着改变我想要显示的内容,并且与我希望代码默认执行的操作相矛盾——即按第一项排序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 2021-01-17
      • 2015-08-01
      相关资源
      最近更新 更多