Как найти элемент управления в строке и привязать его к данным - PullRequest
0 голосов
/ 01 апреля 2012

У меня есть сетка, и в сетке я получил шаблон элемента следующим образом

        <ItemTemplate> 
        <asp:DropDownList runat="server" ID="ddlProductNames"> 
        </asp:DropDownList> 
    </ItemTemplate> 

Теперь в каждой строке в сетке мне нужно привязать это к данным, но у меня возникают проблемы с поискоми привязка его к данным.

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

И я пытаюсь связать выпадающий список следующим образом

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

Я получаю индекс из строки DropDownList ddlProducts = Grid.Rows[e.Row.RowIndex].Cells[1].Controls[0].FindControl("ddlProductNames") as DropDownList; Я изучаю этот процесс, поэтому я был бы признателен за некоторую помощь с точки зрения того, что я делаю неправильно и что мне нужно изменить.Буду очень признателен за любую помощь.

1 Ответ

1 голос
/ 01 апреля 2012

Вы должны использовать FindControl, чтобы найти элементы управления в 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 как переменную-член.Тогда вам не нужно извлекать одни и те же данные для каждой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...