DDL SelectedIndexChanged () не запускается на первом ListItem (ASP.Net C #) - PullRequest
2 голосов
/ 26 июля 2011

Я создал пользовательский шаблонный пользовательский элемент управления для того, чтобы иметь стандартный «контейнер» для использования с нашим веб-приложением, но разрешать в нем любые элементы управления, которые вы хотите - во многом как столбец шаблона GridView / DataGrid , У меня проблема в том, что когда я помещаю элемент управления DropDownList в свой пользовательский элемент управления, метод SelectedIndexChanged этого DDL не всегда срабатывает, и я не понимаю, почему.

Я создал небольшую тестовую страницу с моим пользовательским элементом управления и одним 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 и текст метки остаются в силе PostBack, поэтому я не уверен, что это проблема ViewState.

Я все еще гуглю это, но я в значительной степени озадачен тем, что происходит. Если кто-то еще видел это, сталкивался с этим или может иметь какие-то сведения о возможных исправлениях, я весь в ушах. Очень ценится.

- Андрей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...