web-dev-qa-db-fra.com

Relier la liste déroulante à l'intérieur de gridview edititemtemplate

Je ne peux pas lier ma liste déroulante présente dans le modèle d'édition. J'obtiens une référence nulle lorsque j'essaie d'y accéder.

Mon design: 

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

Mon code derrière: 

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

J'ai essayé de regarder sur le net et j'ai essayé beaucoup de choses en vain. Je suis nouveau à asp Merci d'avance. J'aimerais que le menu déroulant ne soit lié que lorsque l'utilisateur passe en mode édition.

10
Prashanth

Code Behind: Code testé et également définir la valeur sélectionnée de la liste déroulante en mode édition

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
}

Article de blog détaillé: Comment relier une liste déroulante à l'intérieur du modèle d'édition gridview

30
Satinder singh
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;
        }
    }       
2
R.Priya

L'événement RowEditing se produit juste avant la modification d'une ligne. 

Vous devez plutôt utiliser l'événement 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
nunespascal

Je le fais comme ça. Dans lequel, Nom et Id sont deux champs d'objet Société:

Code HTML:

<asp:TemplateField HeaderText="Công ty">
    <EditItemTemplate>
        <asp:DropDownList ID="ddlCompanyEdit" DataSource="<%# PopulateddlCompanyEdit() %>" DataValueField="Id" DataTextField="Name" runat="server"></asp:DropDownList>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="lbCompany" runat="server" Text='<%#Bind("Company") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

Code C # derrière:

protected IEnumerable<Company> PopulateddlCompanyEdit()
{
    using (var bkDb = new BrickKilnDb())
    {
        return bkDb.Companies.ToList();
    }
}
0
Linh Dao

Vous devez utiliser l'événement RowDataBound pour lier le contrôle déroulant de la ligne modifiée. Veuillez utiliser la méthode ci-dessous dans l'événement 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.
0
Mohmedsadiq