2011-11-30 10 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