Я создал пользовательский шаблонный пользовательский элемент управления для того, чтобы иметь стандартный «контейнер» для использования с нашим веб-приложением, но разрешать в нем любые элементы управления, которые вы хотите - во многом как столбец шаблона GridView / DataGrid , У меня проблема в том, что когда я помещаю элемент управления DropDownList в свой пользовательский элемент управления, метод SelectedIndexChanged этого DDL не всегда срабатывает, и я не понимаю, почему.
Я создал небольшую тестовую страницу с моим пользовательским элементом управления и одним 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, метод SelectedIndexChanged не срабатывает, никогда.
Я хотел посмотреть, связано ли это с выбранным значением, поэтому я добавил новый ListItem перед пустым (делая пустой ListItem вторым вариантом):
<asp:ListItem Text="White" Value="0" />
Теперь, когда я запускаю страницу, я могу выбрать цвет, метка обновится, выбрать пустую, и метка будет очищена, но если я выберу «Белый», страница выполнит PostBack, но метод SelectedIndexChanged еще раз не огонь.
Я никогда раньше не сталкивался с этим и признаю, что немного озадачен причиной.
Проблема вполне может быть в моем пользовательском элементе управления, но я не решаюсь так думать, поскольку DDL работает правильно для всех вариантов выбора, кроме первого. Кроме того, выбор DDL и текст метки остаются в силе PostBack, поэтому я не уверен, что это проблема ViewState.
Я все еще гуглю это, но я в значительной степени озадачен тем, что происходит. Если кто-то еще видел это, сталкивался с этим или может иметь какие-то сведения о возможных исправлениях, я весь в ушах. Очень ценится.
- Андрей