在gridview edititemtemplate中绑定下拉列表

我无法绑定edititem模板中的下拉列表。 当我尝试访问它时,我得到空引用。

我的设计:

  <asp:Label ID="drpcategory" Text ='' runat ="server" />       

我的代码背后:

 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新手。 提前致谢。 我希望只有当用户进入编辑模式时才会绑定下拉列表。

代码隐藏:经过测试的代码,并在编辑模式下设置下拉列表选择值

 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 } 

详细博客文章: 如何绑定gridview编辑模板中的下拉列表

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

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

您必须使用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. 

我是这样做的。 其中,Name和Id是Company对象的两个字段:

HTML代码:

         

C#代码背后:

 protected IEnumerable PopulateddlCompanyEdit() { using (var bkDb = new BrickKilnDb()) { return bkDb.Companies.ToList(); } }