2

我以前觉得我的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() 设置为,但没有运气。

有任何想法吗?谢谢

4

5 回答 5

6

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

this.ddl_SortBy.SelectedIndex = -1;

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

if (!IsPostBack)
{
    this.ddl_SortBy.SelectedIndex = -1;
    SearchDirectory();
}
于 2012-07-10T12:22:13.573 回答
1

我发现自己同样需要像您期望的那样在 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);

于 2012-11-21T23:53:13.070 回答
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(); 
}
于 2012-07-10T12:25:09.867 回答
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();
    }

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

于 2012-07-10T12:34:44.827 回答
-1

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

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

这样,选定的索引将更改,并且当用户选择所需的排序顺序时将触发事件。

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

于 2012-07-10T12:23:08.760 回答