Özel ItemTemplate ile ASP.Net Dinamik Gridview

Dinamik bir tablo görünümü oluştururken yardıma ihtiyacım var. Aşağıdaki kaynak kodunu kullanarak ızgarayı sayfaya ekleyebilirim ve veri kaynağındaki her giriş için bir satır oluşturur. Sorun, kontrollerin sadece son sırada göründüğü. Veri kaynağına başka bir giriş eklerseniz, Gridview'de bir satır daha alırım ancak yalnızca sonuncu, ItemTemplate kullanarak eklediğim denetimleri gösterir. Çözümü hata ettiğimde, yeni bir ItemTemplate foreach collumn'u kapattığını ve tüm kontrolleri eklediğini, ancak gridin veri tabanından sonra, son satırın dışındaki tüm hücrelerin boş olduğunu görebiliyorum.

Eğer yapabilirsen lütfen yardım edin. Teşekkürler

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 list = new List();
        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();
    }
}
2

2 cevap

Sorun çözüldü. ItemTemplate sınıfımın InstantiateIn yöntemini yeniden yazmak zorunda kaldım. Teşekkürler.

1
katma

FillGrid'i her aradığınızda ve tekrar yazarken hedef gridview'inizin veri kaynağını değiştiriyor gibi görünüyorsunuz. DataSource atamasını ve DataBind çağrılarını FillGrid yönteminin dışında ve FillGrid (kılavuz) arasında kaldırabilirsiniz; ve placer.Controls.Add (ızgara); BuildGridInterface yöntemindeki satırlar?

Bu yardımcı olursa bize bildirin .. :)

0
katma
her şeyden önce, cevap için teşekkürler. Ben tam olarak anlamadım. Kılavuzun veri tabanına, sütunları oluşturan ve şablonları bunlarla ilişkilendiren "foreach" döngüsünden yalnızca bir kez çağrılır. Hata ayıklama işlemini çalıştırdım ve eminim ki, veri kaynağı özelliği ve kılavuz veri yöntemi yalnızca bir kez çağrılıyor.
katma yazar user662359, kaynak