c# - 带有自定义 ItemTemplate 的 ASP.Net 动态 Gridview

标签 c# asp.net gridview itemtemplate itemplate

我需要一些帮助来呈现动态 GridView 。 使用下面的源代码,我可以将网格添加到页面,它为数据源中的每个条目生成一行。 问题是控件只出现在最后一行。如果我向数据源添加另一个条目,我会在 Gridview 中多一行,但只有最后一行显示我使用 ItemTemplate 添加的控件。 当我调试解决方案时,我可以看到它为每个列实例化了一个新的 ItemTemplate 并添加了所有控件,但是在网格的数据绑定(bind)之后,所有单元格都是空的,除了最后一行的单元格。

如果可以,请帮忙。谢谢

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

最佳答案

问题解决了。我不得不重写 ItemTemplate 类的 InstantiateIn 方法。 谢谢。

关于c# - 带有自定义 ItemTemplate 的 ASP.Net 动态 Gridview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7929398/

相关文章:

c# - 无法使用 DotNetZip 1.9 从 HttpInputStream 读取 zip 文件

asp.net-mvc - 可编辑的 "GridView"像 ASP.NET MVC 中的控件

c# - 是否可以使用适当的命名空间创建新的 C# 脚本?

c# - 带有一些其他参数的 Dropzone

javascript - 检查所选值是否为 'YES' 如果是,则使用 Javascript 启用控件

c# - 如何在浏览器控件中模拟点击事件? 。网

c# - 什么会导致 FindControl() 抛出 NullReferenceException?

c# - 在 Linq 中选择子集

c# - 我如何使我的 gridview 100% 适合页面

android - 从 Android 中的 GridLayout 和 EditBox 中删除默认焦点颜色