简体   繁体   English

具有自定义ItemTemplate的ASP.Net动态Gridview

[英]ASP.Net Dynamic Gridview with custom ItemTemplate

I need some help in rendering a dynamic gridview. 在渲染动态gridview时需要一些帮助。 Using the source code below, I can add the grid to the page and it generates one row for each entry in the datasource. 使用下面的源代码,我可以将网格添加到页面,并为数据源中的每个条目生成一行。 The problem is that the controls only appears in the last row. 问题在于控件仅出现在最后一行。 If I add another entry to the datasource, I get one more row in the Gridview but only the last is showing the controls that I've added using the ItemTemplate. 如果我向数据源添加另一个条目,我将在Gridview中再获得一行,但只有最后一行显示使用ItemTemplate添加的控件。 When I debug the solution I can see that it instatiates a new ItemTemplate foreach collumn and that it adds all the controls, but after the databinding of the grid, all the cells are empty, except the ones of the last row. 当我调试解决方案时,我可以看到它为每个列设置了一个新的ItemTemplate并添加了所有控件,但是在对网格进行数据绑定之后,除了最后一行的所有单元格都是空的。

Please help if you can. 如果可以的话请帮忙。 Thanks 谢谢

private void BuildGridInterface()
{
    TBL_PARAM_01 xpto = new TBL_PARAM_01();
    GridView grid = new GridView();
    grid.ID = "grd";
    grid.AutoGenerateColumns = false;
    grid.ShowHeader = true;
    PropertyInfo[] props = xpto.GetType().GetProperties();

    foreach (PropertyInfo info in props)
    {
        TemplateField field = new TemplateField();

        object[] attributes = info.GetCustomAttributes(true);
        var att = attributes.SingleOrDefault(a => a.GetType() == typeof(Domain));
        WebControl control;

        if (att != null)
        {
            control = new DropDownList();
            control.ID = "drp" + info.Name;
            ((DropDownList)control).Items.Add(new ListItem() { Text = "XXXXX", Value = "1" });
            ((DropDownList)control).Items.Add(new ListItem() { Text = "XXXX2", Value = "2" });
            ((DropDownList)control).Items.Add(new ListItem() { Text = "XXXX3", Value = "3" });
            ((DropDownList)control).Items.Add(new ListItem() { Text = "XXXX4", Value = "4" });
            ((DropDownList)control).Items.Add(new ListItem() { Text = "XXXX5", Value = "5" });
            ((DropDownList)control).Items.Add(new ListItem() { Text = "XXXX6", Value = "6" });
         }
         else
         {
            control = new TextBox();
            control.ID = "txt" + info.Name;
         }

         field.ItemTemplate = new ItemTemplate(control, false, info.Name);                
         field.HeaderText = ((MatrixFieldLabel)attributes.Single(a => a.GetType() == typeof(MatrixFieldLabel))).Value;
         grid.Columns.Add(field);
    }

    FillGrid(grid);
    placer.Controls.Add(grid);
}

public class ItemTemplate : ITemplate
{
    WebControl Control { get; set; }
    bool Enabled { get; set; }
    string ColumName { get; set; }

    public ItemTemplate(WebControl control, bool enabled, string columname)
    {
        this.Control = control;
        this.Enabled = enabled;
        this.ColumName = columname;
        control.DataBinding += new EventHandler(Control_DataBinding);
    }

    public void InstantiateIn(Control container)
    {
        ((WebControl)container).Enabled = Enabled;
        container.Controls.Add(this.Control);
    }

   void Control_DataBinding(object sender, EventArgs e)
   {
       GridViewRow container = (GridViewRow)((Control)sender).NamingContainer;
       object dataValue = DataBinder.Eval(container.DataItem, this.ColumName);
       if (sender.GetType() == typeof(TextBox))
          ((TextBox)sender).Text = dataValue.ToString();
       else if (sender.GetType() == typeof(DropDownList))
          ((DropDownList)sender).SelectedValue = dataValue.ToString();
   }

    private void FillGrid(GridView target)
    {
        List<TBL_PARAM_01> list = new List<TBL_PARAM_01>();
        list.Add(new TBL_PARAM_01() { IDEntityRecordProduct = 1, IDEntityRecordX = 2, Output = "XPTO 3" });
        list.Add(new TBL_PARAM_01() { IDEntityRecordProduct = 2, IDEntityRecordX = 3, Output = "XPTO 4" });
        list.Add(new TBL_PARAM_01() { IDEntityRecordProduct = 3, IDEntityRecordX = 4, Output = "XPTO 5" });
        list.Add(new TBL_PARAM_01() { IDEntityRecordProduct = 4, IDEntityRecordX = 5, Output = "XPTO 6" });
        list.Add(new TBL_PARAM_01() { IDEntityRecordProduct = 5, IDEntityRecordX = 6, Output = "XPTO 7" });

        target.DataSource = list;
        target.DataBind();
    }
}

Problem solved. 问题解决了。 I've had to rewrite the method InstantiateIn of my ItemTemplate class. 我不得不重写ItemTemplate类的InstantiateIn方法。 Thanks. 谢谢。

you appear to be replacing the datasource for your target gridview every time you call FillGrid, and rebinding it. 您似乎在每次调用FillGrid时都要替换目标gridview的数据源,然后重新绑定它。 You could remove your DataSource assignment and DataBind calls outside of the FillGrid method and between FillGrid(grid); 您可以在FillGrid方法外部以及FillGrid(grid)之间删除DataSource分配和DataBind调用; and placer.Controls.Add(grid); 和placer.Controls.Add(grid); lines in the BuildGridInterface method? BuildGridInterface方法中的行?

Let us know if that helps.. :) 让我们知道是否有帮助.. :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM