2011-11-30 58 views
0

所以我有一个下拉列表,当我的gridview处于编辑模式时出现。问题是,当我按下更新按钮时,我得到一个空引用错误。这是因为出于某种原因,更新事件声称GridView中不存在下拉列表。同样可以说,当我看着标记。但是,当我运行该页面并按下编辑按钮时,我的下拉列表出现没有问题。谁能告诉我为什么会出现这种情况?无法在gridview中找到下拉列表

这是我迄今为止用于更新事件的代码隐藏:

 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的标记:

viewsource:

<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> 

任何帮助或建议,不胜感激。

谢谢

+2

为什么您的GridView在会话中? 'GridView gv =(GridView)Session [“MachineTable”];' –

+0

我在试图调试这个问题时使用它,希望看到我的代码进入我的代码,然后分解控件中的位置以尝试找到下拉列表在哪里。 – James213

回答

1

您是否检查过控件集合中的所有控件?

我记得有这样做财产以后这样的:

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

控制可以控制的另一个内进行拼图?我还会用“查看源代码”来检查你的html标记,看看有没有什么奇怪或不合适的地方。

我也建议发布一些标记。所以我们更了解我们正在处理的事情。

3

由于Etch说你可能需要搜索整个控制层次结构。然而Etch的方法是脆弱的。目前控件中的FindControl机制有点弱,因为它只检查直接控制儿童 - 而不是层次结构。下面是一个实现,它将检查所有查找带有所需ID的控件。

/// <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容器作为第一个参数和你正在寻找的子控件的ID来调用它。例如,如果您将这些方法应用到名为ControlHelper的类中(有更好的方法...)

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

if(theList != null) { 
    theList.Selected... ; 
} 
+0

+1为通用的使用(为什么asp.net findcontrol没有实现,但我不明白...?)。如果没有所有铸件,代码就更加可读。 –

+0

+1以获得更完整的答案。 – Etch

+0

@rangitatanz那么我将如何去执行调用findcontrol方法,更具体一点,我不知道我完全明白什么时候调用它的参数。 – James213