C# 如何在一行中查找控件并将其绑定到数据

C# 如何在一行中查找控件并将其绑定到数据,c#,asp.net,data-binding,C#,Asp.net,Data Binding,我有一个gridview,在gridview中我得到了一个项目模板,如下所示 <ItemTemplate> <asp:DropDownList runat="server" ID="ddlProductNames"> </asp:DropDownList> </ItemTemplate> protected void Grid_OnRowDataBound(Object se

我有一个gridview,在gridview中我得到了一个项目模板,如下所示

        <ItemTemplate> 
        <asp:DropDownList runat="server" ID="ddlProductNames"> 
        </asp:DropDownList> 
    </ItemTemplate> 
    protected void Grid_OnRowDataBound(Object sender, GridViewRowEventArgs e)
    {
        // Bind Products
        Product productManager = new Product();
        TList<Product> dsProduct= productManager.GetAll();

        DropDownList ddlProducts = Grid.Rows[e.Row.RowIndex].Cells[1].Controls[0].FindControl("ddlProductNames") as DropDownList;
        if (dsProduct != null)
        {
            DataView dvProduct = new DataView(dsProduct.ToDataSet(true).Tables[0]);
            dvProduct.Sort = "name asc";
            ddlProducts.DataSource = dvBrand;
            ddlProducts.DataTextField = "name";
            ddlProducts.DataValueField = "productId";
            ddlProducts.DataBind();
            ListItem li = new ListItem("No Product Selected", "0");
            ddlProducts.Items.Insert(0, li); 
        }
    }

现在,在gridview中的每一行上,我都需要将其绑定到数据,但是我很难找到它并将其绑定到数据

gridview有4个模板字段,每个模板字段中有1个itemtemplate,如下所示

   <asp:TemplateField HeaderText="Product Name"  ItemStyle-HorizontalAlign = "Center" > 
            <ItemTemplate> 
                <asp:TextBox runat="server" ID="txt1" /> 
            </ItemTemplate> 
            <ItemStyle HorizontalAlign="Center" />   
        </asp:TemplateField> 
        <asp:TemplateField HeaderText="Products" ItemStyle-HorizontalAlign = "Center" > 
            <ItemTemplate> 
                <asp:DropDownList runat="server" ID="ddlProductNames"> 
                </asp:DropDownList> 
            </ItemTemplate> 
            <ItemStyle HorizontalAlign="Center"  />   
        </asp:TemplateField> 
        <asp:TemplateField HeaderText="Image" ItemStyle-HorizontalAlign = "Center" > 
            <ItemTemplate> 
                <asp:FileUpload runat="server" ID="image" /> 
            </ItemTemplate> 
            <ItemStyle  HorizontalAlign="Center"  />   
        </asp:TemplateField> 
        <asp:TemplateField HeaderText="Active" ItemStyle-HorizontalAlign = "Center"> 
            <ItemTemplate> 
                <asp:CheckBox Text="Active" runat="server" ID="active" /> 
            </ItemTemplate> 
            <ItemStyle  HorizontalAlign="Center" /> 
        </asp:TemplateField>   

我正试图将下拉列表绑定如下

        <ItemTemplate> 
        <asp:DropDownList runat="server" ID="ddlProductNames"> 
        </asp:DropDownList> 
    </ItemTemplate> 
    protected void Grid_OnRowDataBound(Object sender, GridViewRowEventArgs e)
    {
        // Bind Products
        Product productManager = new Product();
        TList<Product> dsProduct= productManager.GetAll();

        DropDownList ddlProducts = Grid.Rows[e.Row.RowIndex].Cells[1].Controls[0].FindControl("ddlProductNames") as DropDownList;
        if (dsProduct != null)
        {
            DataView dvProduct = new DataView(dsProduct.ToDataSet(true).Tables[0]);
            dvProduct.Sort = "name asc";
            ddlProducts.DataSource = dvBrand;
            ddlProducts.DataTextField = "name";
            ddlProducts.DataValueField = "productId";
            ddlProducts.DataBind();
            ListItem li = new ListItem("No Product Selected", "0");
            ddlProducts.Items.Insert(0, li); 
        }
    }
protectedvoid Grid\u OnRowDataBound(对象发送方,GridViewRowEventArgs e)
{
//绑定产品
productManager=新产品();
TList dsProduct=productManager.GetAll();
DropDownList ddlProducts=Grid.Rows[e.Row.RowIndex]。单元格[1]。控件[0]。作为DropDownList的FindControl(“ddlProductNames”);
if(dsProduct!=null)
{
DataView-dvProduct=newdataview(dsProduct.ToDataSet(true).Tables[0]);
dvProduct.Sort=“name asc”;
ddlProducts.DataSource=dvBrand;
ddlProducts.DataTextField=“name”;
ddlProducts.DataValueField=“productId”;
ddlProducts.DataBind();
ListItem li=新的ListItem(“未选择任何产品”,“0”);
产品.项目.插入(0,li);
}
}
我在
DropDownList ddlProducts=Grid.Rows[e.Row.RowIndex].Cells[1]行中获取了一个索引外。控件[0]。FindControl(“ddlProductNames”)作为DropDownList我正在学习这个过程,因此我希望能在我做错了什么以及我需要改变什么方面得到一些帮助。非常感谢您的帮助。

您必须使用在TemplateField中查找控件。您还需要排除标题行:

protected void Grid_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        DataRow row = ((DataRowView)e.Row.DataItem).Row;
        DropDownList ddlProducts = (DropDownList)e.Row.FindControl("ddlProductNames");
        ddlProducts.DataSource = someDataSource;
        ddlProducts.DataTextField = "name";
        ddlProducts.DataValueField = "productId";
        ddlProducts.DataBind();
    }
}
您也不需要为网格中的每一行调用
productManager.GetAll()
。您只需要获取当前行的产品。如果每行的源都相同,则应在将GridView绑定为成员变量之前创建它。这样就不需要为每一行检索相同的数据