DDL SelectedIndexChanged()不会在第一个ListItem上触发(ASP.Net C#)

时间:2011-07-25 21:23:48

标签: asp.net event-handling drop-down-menu

我创建了一个自定义的模板化用户控件,目的是在我们的Web应用程序周围使用一个标准的“容器”,但允许你想要的任何控件 - 非常像GridView / DataGrid的模板列。我遇到的问题是,当我将DropDownList控件放在我的自定义控件中时,该DDL的SelectedIndexChanged方法并不总是会触发,而且我很难理解为什么。

我使用自定义控件和单个DDL创建了一个小测试页面,它有一些硬编码值来复制问题:

<uc1:ExpandCollapseRegion ID="xpcColor" runat="server" Title="Pick a Color" AlwaysOpen="true">
<LayoutTemplate>

    <table>
        <tr>
            <td>Color:&nbsp;</td>
            <td>
                <asp:DropDownList ID="ddlColor" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlColor_SelectedIndexChanged">
                    <asp:ListItem Text="" Value="" />
                    <asp:ListItem Text="Red" Value="1" />
                    <asp:ListItem Text="Orange" Value="2" />
                    <asp:ListItem Text="Yellow" Value="3" />
                    <asp:ListItem Text="Green" Value="4" />
                    <asp:ListItem Text="Blue" Value="5" />
                    <asp:ListItem Text="Indigo" Value="6" />
                    <asp:ListItem Text="Violet" Value="7" />
                </asp:DropDownList>
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <asp:Label ID="lblColorChoice" runat="server" />
            </td>
        </tr>
    </table>

</LayoutTemplate>

代码隐藏看起来像这样:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            ((Label)xpcColor.FindControl("lblColorChoice")).Text = "";
        }
    }

    protected void ddlColor_SelectedIndexChanged(object sender, EventArgs e)
    {
        using (DropDownList ddlColor = ((DropDownList)xpcColor.FindControl("ddlColor")))
        {
            if (!String.IsNullOrEmpty(ddlColor.SelectedValue))
            {
                ((Label)xpcColor.FindControl("lblColorChoice")).Text = "You chose the color " + ddlColor.SelectedItem.Text;
            }
            else
            {
                ((Label)xpcColor.FindControl("lblColorChoice")).Text = "";
            }
        }
    }

这里应该发生的一切就是在标签中显示所挑选的颜色,但如果没有挑选颜色,那么只需清除标签即可。很简单,没什么大不了的,但是......

100%的时候,当我选择一种颜色时,SelectedIndexChanged方法会触发,而Label控件会随文本一起更新。我可以选择一种颜色,另一种颜色,然后是另一种颜色,等等一遍又一遍,事情很有效。但是,如果在选择颜色后,我选择了DDL的空白项,那么 的SelectedIndexChanged方法

我想知道这是否与所选值有关,所以我在空白之前添加了一个新的ListItem(将空白ListItem作为第二个选项):

<asp:ListItem Text="White" Value="0" />

现在当我运行页面时,我可以选择一种颜色,标签被更新,选择空白标签并清除标签,但是如果我选择“白色”,则页面再次执行PostBack而不是SelectedIndexChanged方法没有开火。

我以前从未遇到过这种情况,并承认我对这个事业感到有点难过。

问题可能出在我的自定义控件中,但是我很犹豫,因为DDL对所有选择都正常运行,除了第一个选项。 DDL的选择以及Label文本在PostBack中存在,所以我不确定这是否也是ViewState问题。

我仍然是Googl'ing这个,但我很难在这里发生什么事。如果其他人已经看到这个,碰到这个,或者可能有一些可能的修复输入,我都是耳朵。非常感谢。

- 安德鲁

0 个答案:

没有答案