0

我TT.aspx:不能在EditItemTemplate中訪問下拉列表裏面的GridView

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" AutoGenerateEditButton="true" OnRowEditing="GridView1_RowEditing" > 
    <Columns> 
     <asp:TemplateField> 
     <ItemTemplate> 
      <asp:Literal ID="lit1" Text='<%#Eval("E_Name")%>' runat="server"> 

      </asp:Literal> 
     </ItemTemplate> 
     <EditItemTemplate> 
      <asp:DropDownList ID="Eq" AppendDataBoundItems="true" runat="server" DataSourceID="SqlDataSource2" DataTextField="Name" DataValueField="Name"> 

      </asp:DropDownList> 

     </EditItemTemplate> 

     </asp:TemplateField> 

    </Columns> 
</asp:GridView> 
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT [E_Name], [Problem], [Solution] FROM [Equipment] WHERE ([O_ID] = @O_ID)"> 
    <SelectParameters> 
     <asp:QueryStringParameter Name="O_ID" QueryStringField="TT" Type="Int32" /> 
    </SelectParameters> 
</asp:SqlDataSource> 

    <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT [Name] FROM [Parts]"> 
</asp:SqlDataSource> 

我TT.aspx.cs

 protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) 
    { 
     Literal xx = (Literal)GridView1.Rows[e.NewEditIndex].FindControl("lit1"); 
     String x = xx.Text; 
     DropDownList x1 = (DropDownList)GridView1.Rows[e.NewEditIndex].FindControl("Eq"); 
     x1.SelectedValue = x; 
    } 

我是一個新手,asp.net和我只是測試與此代碼。我遇到的問題是第二個FindControl("Eq")總是返回null,而第一個(對於文字)返回正確的值。我嘗試將gridview的編輯索引設置爲e.NewEditIndex,但似乎不起作用。

基本上我想要發生的是,如果用戶單擊了一行上的編輯,則在下拉列表中選擇了標籤中的原始數據綁定值。

有人能指導我完成這個嗎?

+0

檢查這個http://stackoverflow.com/questions/12247279/binding-dropdownlist-inside-gridview-edititemtemplate –

+0

我已經檢查出來前問,不過我還是要說看不出它有什麼關係。我這樣說是因爲他正在'RowDataBound'方法中實現代碼,而我在'RowEditing'方法中實現它。另外我已經嘗試過'GridView1.EditIndex = e.NewEditIndex;'但它不起作用。請糾正我,如果我錯了。 – Mohammad

回答

0

RowEditing事件只是給出正在編輯的行索引。您需要將編輯行索引設置爲網格並重新綁定它。如果你需要設置的值或者需要綁定內EditItemTemplate你必須這樣做,在RowDateBound性事件的控制,你會在RowEditing事件被重新綁定網格,以便在RowDataBound事件也會給你的EditItemTemplate的控制。

如圖this answer

protected void gv_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    // grid view's edit index has been changed so rebind it 
    gv.EditIndex = e.NewEditIndex; 
} 

protected void gv_RowDataBound(object sender, GridViewEditEventArgs e) 
{ 
if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     if ((e.Row.RowState & DataControlRowState.Edit) > 0) 
     { 
      ddList.SelectedValue = "set your value here"; 
     } 
    } 
} 
+0

+1,但如果使用DataSource屬性和DataBind方法手動綁定GridView,則只需設置EditIndex。這個答案在沒有RowEditing事件重新綁定GridView的情況下工作。 – Sean

+0

我現在試試,但很快就提出問題;將點擊編輯按鈕調用'RowDataBound'方法?如果沒有,那麼我怎樣才能從'RowEditing'方法編程調用它? – Mohammad

+0

按下編輯按鈕將調用RowEditing事件,並且在重新綁定網格時行編輯事件中,RowDateBound事件將觸發,因爲@Sean指出您正在使用「DataSource」屬性,因此您不需要重新綁定剛剛設置的網格'EditIndex'''RowDataBound'將被自動觸發。 –