2012-09-03 85 views
9

我無法綁定edititem模板中存在的下拉列表。當我嘗試訪問它時,我得到空引用。gridview edititemtemplate中綁定下拉列表

我的設計:

<asp:TemplateField HeaderText ="Category"> 
    <ItemTemplate > 
    <asp:Label ID="drpcategory" Text ='<%#Bind("category") %>' runat ="server" /> 
    </ItemTemplate> 
    <EditItemTemplate> 
     <asp:DropDownList ID="drpcategory1" AppendDataBoundItems="True" runat="server" > 
     </asp:DropDownList> 
    </EditItemTemplate> 
</asp:TemplateField> 

我後面的代碼:

protected void gv_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    gv_table1.EditIndex = e.NewEditIndex; 
    DropDownList drpcategory1 = ((DropDownList)gv_table1.Rows[e.NewEditIndex].Cells[8].FindControl("drpcategory1")); 
    //BindDropDown(drpcategory1); 
    dt = con.GetData("Select category_name from category"); 

    String str = gv_table1.Rows[e.NewEditIndex].FindControl("drpcategory1").GetType().ToString(); 
    //((DropDownList)gv_table1.Rows[e.NewEditIndex].Cells[8].FindControl("drpcategory1")).DataSource = dt; 
    drpcategory1.DataSource = dt; 
    drpcategory1.DataTextField = "category_name"; 
    drpcategory1.DataValueField = "category_name"; 
    drpcategory1.DataBind(); 

    this.setgrid(); 
} 

我試着找上了網,妄圖很多東西。我對asp很陌生。提前致謝。我希望僅當用戶進入編輯模式時才能綁定下拉菜單。

+0

什麼是gv_table1?我認爲這可能是問題。請檢查 – kbvishnu

+2

由於'NamingContainer'不是單元格,因此不要使用'Cells [8] .FindControl(「drpcategory1」)'而是'row.FindControl(「drpcategory1」)''。你的方式更容易出錯。 –

+0

我只使用row.findcontrol。我也使用了cells.I嘗試過但沒有得到想要的結果。 – Prashanth

回答

30

代碼背後:測試的代碼,也可以設置下拉列表上的編輯模式中選擇價值

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     if ((e.Row.RowState & DataControlRowState.Edit) > 0) 
     { 
      DropDownList ddList= (DropDownList)e.Row.FindControl("drpcategory1"); 
      //bind dropdown-list 
      DataTable dt = con.GetData("Select category_name from category"); 
      ddList.DataSource = dt; 
      ddList.DataTextField = "category_name"; 
      ddList.DataValueField = "category_name"; 
      ddList.DataBind(); 

      DataRowView dr = e.Row.DataItem as DataRowView; 
      //ddList.SelectedItem.Text = dr["category_name"].ToString(); 
      ddList.SelectedValue = dr["category_name"].ToString(); 
     } 
    } 
} 

protected void gv_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    gv.EditIndex = e.NewEditIndex; 
    gridviewBind();// your gridview binding function 
} 

詳細博客文章:How to bind drop-down list inside gridview edit template

+0

得到了想要的東西man.But DataRowView dr = e.Row.DataItem作爲DataRowView; ddList.SelectedItem.Text = dr [「category_name」]。ToString();這兩行顯示錯誤,刪除這兩行我執行並得到輸出的兄弟。感謝兄弟 – Prashanth

+0

@Prashanth:好,如果它幫助,以及可以粘貼你得到這些線的錯誤信息。 –

+0

老兄我糾正了這個錯誤,它只是一個命名問題,但現在兄弟都很好,但現在下拉列表中的第一個元素正在被重寫爲標籤值man當處於編輯模式(即)我重複了一個元素,也失去了希望你明白我的意思。 – Prashanth

0

事件RowEditing出現在行編輯之前。

您應該改用RowDataBound事件。

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (gv.EditIndex == e.Row.RowIndex && 
     e.Row.RowType==DataControlRowType.DataRow) 
    {  
     DropDownList drpcategory1 = (DropDownList)e.Row.FindControl("drpcategory1"); 
     //bind the control 
    } 
} 
+0

Drpcategory1值只有當我把斷點並檢查價值。我按你的說法做了。 – Prashanth

0

您必須使用RowDataBound事件綁定編輯行的下拉控件。請在RowDataBound事件中使用以下方法。

 protected void gv_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowState == DataControlRowState.Edit) 
     { 
      DropDownList drpcategory1 = (DropDownList)e.Row.FindControl("drpcategory1"); 
      DataTable dt = con.GetData("Select category_name from category"); 
      drpcategory1.DataSource = dt; 
      drpcategory1.DataTextField = "category_name"; 
      drpcategory1.DataValueField = "category_name"; 
      drpcategory1.DataBind(); 
     } 
    } 

Hope this will help you. 
2
protected void gvProject_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     try 
     { 
      string Active = ""; 
      if (e.Row.DataItem != null) 
      { 
       if ((e.Row.RowState & DataControlRowState.Edit) > 0) 
       { 
        Label lblEditActive = (Label)e.Row.FindControl("lblUP_ET_ActiveStatus"); 
        if (lblEditActive.Text != string.Empty) 
        { 
         Active = lblEditActive.Text.Trim(); 
        } 

        DropDownList ddlActive = (DropDownList)e.Row.FindControl("ddlUP_ET_ActiveStatus"); 
        ddlActive.Items.Clear(); 
        ddlActive.Items.Add("True"); 
        ddlActive.Items.Add("False"); 
        ddlActive.DataBind(); 
        ddlActive.Items.FindByText(Active).Selected = true; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    }