Невозможно найти выпадающий список в gridview - PullRequest
0 голосов
/ 30 ноября 2011

Так что у меня есть выпадающий список, который появляется, когда мой gridview находится в режиме редактирования.Проблема в том, что когда я нажимаю кнопку обновления, я получаю нулевую ссылку.Это связано с тем, что по какой-то причине событие обновления утверждает, что выпадающий список не существует в виде сетки.То же самое можно сказать, когда я смотрю на разметку.Однако, когда я запускаю страницу и нажимаю кнопку редактирования, мой выпадающий список появляется без проблем.Может кто-нибудь сказать мне, почему это так?

Это то, что у меня есть для codebehind с событием обновления:

        protected void GridViewHolder_Updating(object sender, GridViewUpdateEventArgs e) 
    {

        int machineid1;
        string machineid;
        string machineTypeid;
        string machineModelid;

        GridViewRow row = (GridViewRow)GridViewHolder.Rows[e.RowIndex];

        machineid = ((Label)(row.Cells[0].Controls[1])).Text;
        machineid1 = Convert.ToInt32(machineid); 
        machineTypeid = ((DropDownList)(row.Cells[3].FindControl("MachineTypeDropDown"))).SelectedValue;
        machineModelid = ((DropDownList)(row.Cells[4].Controls[1])).SelectedValue;



        //inputsService.UpdateMachineTypes(machineid, machineTypeid);
        //inputsService.UpdateMachineModels(machineid, machineModelid);

    }

ниже вы найдете разметку и.разметка ascx gridview:

источник:

<th scope="col">Site Name</th><th scope="col">Machine Name</th><th scope="col">Machine Type</th><th scope="col">Machine Model</th><th scope="col">&nbsp;</th>

                        </tr><tr align="center" style="background-color:Transparent;">

                            <td>SACRAMENTO</td><td>DC04</td><td>

                        <span id="AssignMachineTypesAndModels_userControl_GridViewHolder_ctl02_MachineTypeLabel">empty</span>                            

                    </td><td>

                        <span id="AssignMachineTypesAndModels_userControl_GridViewHolder_ctl02_MachineModelLabel">empty</span>                            

                    </td><td align="center"><input type="button" value="Edit" onclick="javascript:__doPostBack('AssignMachineTypesAndModels_userControl$GridViewHolder','Edit$0')" /></td>

                        </tr><tr align="center" style="background-color:Transparent;">

                            <td>SACRAMENTO</td><td>DC1</td><td>

                        <span id="AssignMachineTypesAndModels_userControl_GridViewHolder_ctl03_MachineTypeLabel">empty</span>                            

                    </td><td>

                        <span id="AssignMachineTypesAndModels_userControl_GridViewHolder_ctl03_MachineModelLabel">empty</span>                            

                    </td><td align="center"><input type="button" value="Edit" onclick="javascript:__doPostBack('AssignMachineTypesAndModels_userControl$GridViewHolder','Edit$1')" /></td>

                        </tr><tr align="center" style="background-color:Transparent;">

                            <td>SACRAMENTO</td><td>MPS01</td><td>

                        <span id="AssignMachineTypesAndModels_userControl_GridViewHolder_ctl04_MachineTypeLabel">empty</span>                            

                    </td><td>

                        <span id="AssignMachineTypesAndModels_userControl_GridViewHolder_ctl04_MachineModelLabel">empty</span>                            

                    </td><td align="center"><input type="button" value="Edit" onclick="javascript:__doPostBack('AssignMachineTypesAndModels_userControl$GridViewHolder','Edit$2')" /></td>

                        </tr><tr align="center" style="background-color:Transparent;">

                            <td>SACRAMENTO</td><td>MSE01</td><td>

                        <span id="AssignMachineTypesAndModels_userControl_GridViewHolder_ctl05_MachineTypeLabel">empty</span>                            

                    </td><td>

                        <span id="AssignMachineTypesAndModels_userControl_GridViewHolder_ctl05_MachineModelLabel">empty</span>                            

                    </td><td align="center"><input type="button" value="Edit" onclick="javascript:__doPostBack('AssignMachineTypesAndModels_userControl$GridViewHolder','Edit$3')" /></td>

разметка gridview:

 <Columns>
                <asp:TemplateField HeaderText="ID" 
                                   SortExpression="ID" 
                                   Visible="False">
                    <ItemTemplate>
                        <asp:Label ID="Label1" 
                                   runat="server" 
                                   Text='<%# Bind("ID") %>'
                                   Visible="false">
                        </asp:Label>
                    </ItemTemplate>
                    <EditItemTemplate>
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="SiteName" 
                                HeaderText="Site Name" 
                                SortExpression="SiteName"
                                ReadOnly="true" />
                <asp:BoundField DataField="Name" 
                                HeaderText="Machine Name" 
                                ReadOnly="true" 
                                SortExpression="Name" />
                <asp:TemplateField HeaderText="Machine Type" 
                                   SortExpression="MachineType">
                    <ItemTemplate>
                        <asp:Label ID="MachineTypeLabel" 
                                   runat="server" 
                                   Text='<%# Bind("MachineType") %>'>
                        </asp:Label>                            
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID="MachineTypeDropDown" 
                                          runat="server" 
                                          AppendDataBoundItems="True"                                                
                                          Height="21px" 
                                          Width="217px" 
                                          DataSourceID="GetMachineType" 
                                          DataTextField="Name" 
                                          DataValueField="ID">
                            <asp:ListItem Enabled="true" 
                                          Text="Select a Machine Type." 
                                          Value="NULL">
                            </asp:ListItem>
                        </asp:DropDownList>
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Machine Model" SortExpression="MachineModel">
                    <ItemTemplate>
                        <asp:Label ID="MachineModelLabel" 
                                   runat="server" 
                                   Text='<%# Bind("MachineModel") %>'>
                        </asp:Label>                            
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID="MachineModelDropDown" 
                                          runat="server" 
                                          AppendDataBoundItems="True"                                                
                                          Height="21px" Width="217px" 
                                          DataSourceID="GetMachineModel" 
                                          DataTextField="Name" 
                                          DataValueField="ID">
                            <asp:ListItem Enabled="true" 
                                          Text="Select a Machine Model." 
                                          Value="NULL">
                            </asp:ListItem>
                        </asp:DropDownList>
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:CommandField ButtonType="Button" 
                                  ShowEditButton="True"
                                  CausesValidation="false" >
                    <ItemStyle HorizontalAlign="Center" 
                               Wrap="True" />
                </asp:CommandField>
            </Columns>

Любая помощь или предложения очень приветствуются.1016 *

Ответы [ 2 ]

3 голосов
/ 30 ноября 2011

Как говорит Этч, вам может потребоваться выполнить поиск по всей иерархии элементов управления.Однако подход Этча неубедителен.Механизм FindControl в элементе управления в настоящее время немного слаб, поскольку он проверяет только то, что контролирует дочерние элементы напрямую, а не иерархию.Ниже приведена реализация, которая проверит все это в поисках нужного элемента управления.

/// <summary>
/// Similar to Control.FindControl, but recurses through child controls.
/// </summary>
public static T FindControl<T>(Control startingControl, string id) where T : Control
{        
    T found = startingControl.FindControl(id) as T; 

    if (found == null)
    {
        found = FindChildControl<T>(startingControl, id);
    }

    return found;     
}

 /// <summary>     
/// Similar to Control.FindControl, but recurses through child controls.
/// Assumes that startingControl is NOT the control you are searching for.
/// </summary>
public static T FindChildControl<T>(Control startingControl, string id) where T : Control
{
    T found = null;

    foreach (Control activeControl in startingControl.Controls)
    {
        found = activeControl as T;

        if (found == null || (string.Compare(id, found.ID, true) != 0))
        {
            found = FindChildControl<T>(activeControl, id);
        }

        if (found != null)
        {
            break;
        }
    }

    return found;
}

Таким образом, вы должны назвать это с вашим контейнером gridview в качестве первого параметра и идентификатором дочернего элемента управления, который вы ищете.Например, если вы реализовали эти методы в классе с именем ControlHelper (есть лучшие способы ...)

DropDownList theList = ControlHelper.FindControl<DropDownList>(grdViewParentInstance, "MachineTypeDropDown");

if(theList != null) {
    theList.Selected... ;
}
1 голос
/ 30 ноября 2011

Вы проверили все элементы управления в коллекции элементов управления?

Я помню, что должен был сделать что-то вроде этого:

 machineModelid = ((DropDownList)(row.Cells[3].Controls[0].Controls[1])).SelectedValue;

Элемент управления может быть вложен в другой элемент управления?Я также проверил бы вашу html-разметку с «источником просмотра» и посмотрел бы, выглядит ли что-то странное или неуместное.

Я бы также предложил опубликовать некоторую разметку.Итак, мы знаем немного больше о том, с чем имеем дело.

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