我创建了一个自定义的模板化用户控件,目的是在我们的Web应用程序周围使用一个标准的“容器”,但允许你想要的任何控件 - 非常像GridView / DataGrid的模板列。我遇到的问题是,当我将DropDownList控件放在我的自定义控件中时,该DDL的SelectedIndexChanged方法并不总是会触发,而且我很难理解为什么。
我使用自定义控件和单个DDL创建了一个小测试页面,它有一些硬编码值来复制问题:
<uc1:ExpandCollapseRegion ID="xpcColor" runat="server" Title="Pick a Color" AlwaysOpen="true">
<LayoutTemplate>
<table>
<tr>
<td>Color: </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的空白项,那么
我想知道这是否与所选值有关,所以我在空白之前添加了一个新的ListItem(将空白ListItem作为第二个选项):
<asp:ListItem Text="White" Value="0" />
现在当我运行页面时,我可以选择一种颜色,标签被更新,选择空白标签并清除标签,但是如果我选择“白色”,则页面再次执行PostBack而不是SelectedIndexChanged方法没有开火。
我以前从未遇到过这种情况,并承认我对这个事业感到有点难过。
问题可能出在我的自定义控件中,但是我很犹豫,因为DDL对所有选择都正常运行,除了第一个选项。 DDL的选择以及Label文本在PostBack中存在,所以我不确定这是否也是ViewState问题。
我仍然是Googl'ing这个,但我很难在这里发生什么事。如果其他人已经看到这个,碰到这个,或者可能有一些可能的修复输入,我都是耳朵。非常感谢。
- 安德鲁