Gridview FindControl находит календарь, но не DropDownList

У меня есть DropDownList в GridView EditItemTemplate. Ddl должен быть заполнен во время выполнения; параметры в каждой строке могут отличаться.

GridView работает должным образом. В режиме без редактирования он привязывается к данным. В режиме редактирования отображаются элементы управления, указанные в EditItemTemplate.

Вопрос: Почему я не могу найти элемент управления в этом DropDownList ??? Обратите внимание, что я могу FindControl в элементе управления Calendar, который также находится в EditItemTemplate.

Ниже приведен код ASPX и C #.

Спасибо!!

<asp:UpdatePanel ID="UpdatePanelSelections" runat="server">
<ContentTemplate>
    <asp:GridView ID="GridViewSelections" runat="server" 
        ...

        <Columns>

            <asp:TemplateField HeaderText="Options" >
                <ItemTemplate>
                    <asp:Label ID="CurrentOption" runat="server" 
                        Text='<%# Eval("Options.OptionName") %>'>
                    </asp:Label>
                </ItemTemplate>

                <EditItemTemplate>
                    <asp:DropDownList ID="ddlOptions" runat="server" >
                    </asp:DropDownList>
                </EditItemTemplate>
                <HeaderStyle HorizontalAlign="Left" />
            </asp:TemplateField>


            <asp:TemplateField HeaderText="Date" >
                <ItemTemplate>
                    <asp:Label ID="CurrentlySelectedDate" runat="server" 
                        Text='<%# Eval("SomeDate") %>'>
                    </asp:Label>
                </ItemTemplate>

                <EditItemTemplate>
                    <asp:Calendar ID="calNewDate" runat="server" SelectedDate='<%# Bind("SomeDate") %>' VisibleDate='<%# Bind("SomeDate") %>' />
                </EditItemTemplate>
                <HeaderStyle HorizontalAlign="Left" />
            </asp:TemplateField>

        ...


    protected void GridViewSelections_RowEditing(object sender, GridViewEditEventArgs e)
   {
    // FindControl calNewDate works in GridViewSelections_RowUpdating but not in GridViewSelections_RowEditing
    Calendar calNewDate = GridViewSelectionss.Rows[e.NewEditIndex].FindControl("calNewDate") as Calendar;

    // FindControl ddlOptions doesn't work anywhere!
    DropDownList ddlOptions = GridViewSelections.Rows[e.NewEditIndex].FindControl("ddlOptions") as DropDownList;

// Looking in Cells doesn't work either
DropDownList ddlOptions2 = GridViewSelections.Rows[e.NewEditIndex].Cells[2].FindControl("ddlOptions") as DropDownList;

person Mark Maslar    schedule 03.02.2011    source источник
comment
в какой момент вы выполняете код FindControl, возможно, до того, как gridview сгенерирует строки?   -  person Kris Ivanov    schedule 03.02.2011
comment
Я запускаю его в RowEditing. Намерение состоит в том, чтобы взять параметры для этой конкретной строки и заполнить ddl.   -  person Mark Maslar    schedule 03.02.2011
comment
попробуйте сделать это в событии привязки, я не думаю, что эта строка еще создана, только индекс   -  person Kris Ivanov    schedule 03.02.2011
comment
проверьте DataControlRowState.Edit даже в привязке данных, и это строка, в которой вы хотите выполнить findcontrol   -  person Kris Ivanov    schedule 03.02.2011
comment
В _RowDataBound, if (e.Row.RowType == DataControlRowType.DataRow) {GridViewSelections.Rows.Count // Здесь счетчик равен 0   -  person Mark Maslar    schedule 03.02.2011
comment
if ((e.Row.RowType == DataControlRowType.DataRow) && (e.Row.RowState.HasFlag (DataControlRowState.Edit))) {// Здесь количество строк равно 1. e.Row.RowIndex == 1, но попытка доступа к этой строке GridView взрывается - индекс выходит за пределы допустимого диапазона.   -  person Mark Maslar    schedule 04.02.2011


Ответы (1)


Оказалось, что решение заключается в проверке того, что DataItem не равен нулю. Просто проверить наличие флагов RowType и Edit было недостаточно.

protected void GridViewSelections_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if ((e.Row.RowType == DataControlRowType.DataRow) && (e.Row.RowState.HasFlag(DataControlRowState.Edit) && (e.Row.DataItem != null)))
    {
        DropDownList ddlOptions = e.Row.FindControl("ddlOptions") as DropDownList;
        ddlOptions.Items.Add(new ListItem("aaa", "1"));
        ddlOptions.Items.Add(new ListItem("bbb", "2"));
        ddlOptions.Items.Add(new ListItem("ccc", "3"));
person Mark Maslar    schedule 03.02.2011