C#动态GridView / DataTable设置

时间:2013-08-20 04:26:13

标签: gridview dynamic datatable webforms

我正在为一家公司工作,这对我工作的公司来说是完全动态的。我试图让GridView以我想要的方式工作。

但他们改变了一点......

  • 我有一个GridView。
  • 每个列和行都将是一个将数字放入的TextBox。
  • 您从1列开始,只需按一下按钮即可添加多个列。
  • 有固定数量的行(23)。

我尝试将文本框添加到数据行,如下所示,但它只显示了TextBox所在的命名空间的字符串。我该怎么办?我想避免任何ASP的东西,我没有丝毫的线索它正在做什么

这是我到目前为止所做的。

DataTable dt = new DataTable();
DataColumn dc = new DataColumn("MICRONS",typeof(TextBox));

dt.Columns.Add(dc);

for (int i = 0; i < 23; ++i)
{
    TextBox tb = new TextBox();
    DataRow row = dt.NewRow();

    row["MICRONS"] = tb;
    dt.Rows.Add(row);
}
foreach (DataColumn col in dt.Columns)
{
    BoundField bField = new BoundField();
    bField.DataField = col.ColumnName;
    bField.HeaderText = col.ColumnName;
    GridView1.Columns.Add(bField);
} 

GridView1.DataSource = dt;

1 个答案:

答案 0 :(得分:-1)

好根据你的问题和我的感觉似乎你想动态添加文本框。如果是,那么创建一个类并在该类中写下代码:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
using System.Collections;
/// <summary>
/// Summary description for DynamicTemplate
/// </summary>
public class DynamicTemplate : System.Web.UI.ITemplate
{
public String TableName { get; set; }

System.Web.UI.WebControls.ListItemType templateType;
System.Collections.Hashtable htControls = new System.Collections.Hashtable();
System.Collections.Hashtable htBindPropertiesNames = new System.Collections.Hashtable();
System.Collections.Hashtable htBindExpression = new System.Collections.Hashtable();

public DynamicTemplate(System.Web.UI.WebControls.ListItemType type)
{
    templateType = type;
}

public void AddControl(WebControl wbControl, String BindPropertyName, String BindExpression)
{
    htControls.Add(htControls.Count, wbControl);
    htBindPropertiesNames.Add(htBindPropertiesNames.Count, BindPropertyName);
    htBindExpression.Add(htBindExpression.Count, BindExpression);
}

public void AddControl(HtmlControl wbControl, String BindPropertyName, String BindExpression)
{
    htControls.Add(htControls.Count, wbControl);
    htBindPropertiesNames.Add(htBindPropertiesNames.Count, BindPropertyName);
    htBindExpression.Add(htBindExpression.Count, BindExpression);
}

public void InstantiateIn(System.Web.UI.Control container)
{
    PlaceHolder ph = new PlaceHolder();

    for (int i = 0; i < htControls.Count; i++)
    {
        //clone control 
        Control cntrl = CloneControl((Control)htControls[i]);

        switch (templateType)
        {
            case ListItemType.Header:
                break;
            case ListItemType.Item:
                ph.Controls.Add(cntrl);
                break;
            case ListItemType.AlternatingItem:
                ph.Controls.Add(cntrl);
                ph.DataBinding += new EventHandler(Item_DataBinding);
                break;
            case ListItemType.Footer:
                break;
        }
    }
    ph.DataBinding += new EventHandler(Item_DataBinding);
    container.Controls.Add(ph);
}
public void Item_DataBinding(object sender, System.EventArgs e)
{
    PlaceHolder ph = (PlaceHolder)sender;
    GridViewRow ri = (GridViewRow)ph.NamingContainer;
    for (int i = 0; i < htControls.Count; i++)
    {
        if (htBindPropertiesNames[i].ToString().Length > 0)
        {
            Control tmpCtrl = (Control)htControls[i];

            String item1Value = GetType(htBindExpression[i].ToString(), ri);

            //Guid value = new Guid(DataBinder.Eval(ri.DataItem, htBindExpression[i].ToString()).ToString());
            //String valueString = value.ToString();
            //item1Value = item1Value1.ToString();

            Control ctrl = ph.FindControl(tmpCtrl.ID);
            Type t = ctrl.GetType();
            System.Reflection.PropertyInfo pi = t.GetProperty(htBindPropertiesNames[i].ToString());
            if (pi != null)
            {
                pi.SetValue(ctrl, item1Value.ToString(), null);
            }
        }
    }
}

private String GetType(String ColumnName, GridViewRow row)
{
    String Result = "";
    clsSearch obj = new clsSearch();
    // i have set up the table name static as now we require to make search working for macintosh project only.
    // as per rakesh sir directed.
    Int32 Type = obj.GetNumberForDataTypeofColumn("tblProperty", ColumnName);
    switch (Type)
    {
        case 1:
            DateTime dtvalue = (DateTime)DataBinder.Eval(row.DataItem, ColumnName);
            Result = dtvalue.ToString();
            break;
        case 2:
            String svalue = (String)DataBinder.Eval(row.DataItem, ColumnName);
            Result = svalue;
            break;
        case 3:

            break;
        case 4:
            Int32 ivalue = (Int32)DataBinder.Eval(row.DataItem, ColumnName);
            Result = ivalue.ToString();
            break;
        case 5:
            Guid gvalue = (Guid)DataBinder.Eval(row.DataItem, ColumnName);
            Result = gvalue.ToString();
            break;
    }

    return Result;
}

private Control CloneControl(System.Web.UI.Control src_ctl)
{
    Type t = src_ctl.GetType();
    Object obj = Activator.CreateInstance(t);
    Control dst_ctl = (Control)obj;
    PropertyDescriptorCollection src_pdc = TypeDescriptor.GetProperties(src_ctl);
    PropertyDescriptorCollection dst_pdc = TypeDescriptor.GetProperties(dst_ctl);

    for (int i = 0; i < src_pdc.Count; i++)
    {
        if (src_pdc[i].Attributes.Contains(DesignerSerializationVisibilityAttribute.Content))
        {
            object collection_val = src_pdc[i].GetValue(src_ctl);
            if ((collection_val is IList) == true)
            {
                foreach (object child in (IList)collection_val)
                {
                    Control new_child = CloneControl(child as Control);
                    object dst_collection_val = dst_pdc[i].GetValue(dst_ctl);
                    ((IList)dst_collection_val).Add(new_child);
                }
            }
        }
        else
        {
            dst_pdc[src_pdc[i].Name].SetValue(dst_ctl, src_pdc[i].GetValue(src_ctl));
        }
    }

    return dst_ctl;

 }
}

现在可以使用绑定grid的方法。在绑定Grid之前,在指定DataSource to Grid之前,请使用以下代码根据您的要求添加文本框。我正在添加一个例如。

    TemplateField t = new TemplateField();
    DynamicTemplate mt = new DynamicTemplate(ListItemType.Item);

    TextBox ibtnEdit = new TextBox();
    ibtnEdit.ID = "btnEdit";
    ibtnEdit.CssClass = "EditButton";
    ibtnEdit.ToolTip = "Name";
    mt.AddControl(ibtnEdit, "AlternateText", "Id");
    t.ItemTemplate = mt;
    t.HeaderText = "Activity";
    t.HeaderStyle.HorizontalAlign = HorizontalAlign.Left;
    GridView1.Columns.Add(t);
    GridView1.DataSource = datatable;
    GridView1.DataBind();

就是这样。

相关问题