Add Column Dynamically to DataGrid to Display Calculation
http://www.c-sharpcorner.com/Code/2003/May/AddingDataGridColumnToCal.aspAdd Column Dynamically to DataGrid to Display Calculation
http://www.c-sharpcorner.com/Code/2003/Feb/DynamicDataGrid.asp

解决方案 »

  1.   

    如果是这样绑定的话
    <asp:BoundColumn DataField="Total" HeaderText="Total" DataFormatString="{0:c}">
    </asp:BoundColumn>
    我就不能随时改变绑定的字段了,应为绑定的字段,是不定的,根据条件改变
      

  2.   

    Dim myTable As DataTable = new DataTable("myTable") 
        Dim myColumn As DataColumn = New DataColumn 
        myColumn.DataType = System.Type.GetType("System.Decimal") 
        myColumn.AllowDBNull = False 
        myColumn.Caption = "Price"  
        myColumn.ColumnName = "Price" 
        myColumn.DefaultValue = 25 
        myTable.Columns.Add(myColumn) 
        Dim myRow As DataRow 
        Dim i As Integer  
        For i = 0 to 9 
           myRow = myTable.NewRow() 
           myRow("Price") = i + 1 
           myTable.Rows.Add(myRow) 
        Next i 
      

  3.   

    BoundColumn col = new BoundColumn();
    col.HeaderText = "HeadText";
    col.DataField = "DataField";
    this.DataGrid1.Columns.Add(col);
      

  4.   

    上面的绑定不可以动态绑定数据,下面是我以前写动态绑定权限群组时候写的一个动态绑定代码,你可以参考以下,并使用了TemplateColumn,里面动态绑定的是CheckBox,你也可以自己替换为其它的控件:
    public class DataGridTemplate : System.Web.UI.ITemplate
    {
    ListItemType templateType;
    string columnName;
    string titleName;
    public DataGridTemplate(ListItemType type, string colname, string title)
    {
    templateType = type;
    columnName   = colname;
    titleName    = title;
    } public void InstantiateIn(System.Web.UI.Control container)
    {
    Literal lc = new Literal();
    switch(templateType)
    {
    case ListItemType.Header:
    lc.Text = "<B>" + titleName + "</B>";
    container.Controls.Add(lc);
    break;
    case ListItemType.Item:
    CheckBox cb = new CheckBox();
    cb.DataBinding += new EventHandler(TemplateControl_DataBinding);
    container.Controls.Add(cb);
    break;
    case ListItemType.EditItem:
    TextBox tb = new TextBox();
    tb.Text = "";
    container.Controls.Add(tb);
    break;
    case ListItemType.Footer:
    lc.Text = columnName;
    container.Controls.Add(lc);
    break;
    }
    } public void TemplateControl_DataBinding(object sender, System.EventArgs e)
    {
    CheckBox cb;
    cb = (CheckBox)sender;
    DataGridItem container = (DataGridItem) cb.NamingContainer;
    cb.Checked = (bool)((DataRowView)container.DataItem)[columnName];
    }
    }
    以上是定义部分,调用部分在下面Code:
    for (int i=0; i<dtRoles.Rows.Count; i++)   //根據群組添加欄位
    {
    TemplateColumn tc = new TemplateColumn();
    tc.HeaderStyle.Width = Unit.Pixel(60);
    tc.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
    tc.HeaderTemplate = new DataGridTemplate(ListItemType.Header, dtRoles.Rows[i]["FRoleName"].ToString(), dtRoles.Rows[i]["FDesc"].ToString());
    tc.ItemTemplate = new DataGridTemplate(ListItemType.Item, dtRoles.Rows[i]["FRoleName"].ToString(), dtRoles.Rows[i]["FDesc"].ToString());
    tc.EditItemTemplate = new DataGridTemplate(ListItemType.EditItem, dtRoles.Rows[i]["FRoleName"].ToString(), dtRoles.Rows[i]["FDesc"].ToString());
    tc.FooterTemplate = new DataGridTemplate(ListItemType.Footer, dtRoles.Rows[i]["FRoleName"].ToString(), dtRoles.Rows[i]["FDesc"].ToString()); dgMenu.Columns.Add(tc);
    }
    希望能对你有所帮助!
      

  5.   

    里面主要是重载了一个 System.Web.UI.ITemplate 的 InstantiateIn() 事件!
      

  6.   

    private void SearchStat(string SearchType)
    {
    DataSet ds=new DataSet();
    string strSQL = "";
    SqlConnection sqlConn=new SqlConnection(strConn);
    BoundColumn bc = new BoundColumn();
    if (SearchType !="Test")
    {
    if (SearchType == "Chapter")
    {
    if (Session["ClassID"].ToString()!=""||Session["ClassID"].ToString()!=null)
    {
    strSQL="select top 10 * from sxzxxjg where kmbh="+Session["ClassID"].ToString()+" order by xxrs desc";
    bc = new BoundColumn();
    bc.HeaderText = "章的名称";
    bc.DataField = "zmc";
    this.dgrResult.Columns.Add(bc); bc = new BoundColumn();
    bc.HeaderText = "学习人数";
    bc.DataField = "xxrs";
    this.dgrResult.Columns.Add(bc);
    }
    }
    else if (SearchType == "Item")
    {
    if (Session["ClassID"].ToString()!=""||Session["ClassID"].ToString()!=null)
    {
    strSQL="Select top 10 * From sxxxjg where kmbh="+Session["ClassID"].ToString()+"order by xxrs desc";
    bc = new BoundColumn();
    bc.HeaderText = "知识点的名称";
    bc.DataField = "mc";
    this.dgrResult.Columns.Add(bc); bc = new BoundColumn();
    bc.HeaderText = "学习人数";
    bc.DataField = "xxrs";
    this.dgrResult.Columns.Add(bc);
    }
    }
    else if (SearchType == "Article")
    {
    strSQL="Select top 10 scmc,cs From jcxgwxqd group by scmc, cs order by cs desc";
    bc = new BoundColumn();
    bc.HeaderText = "文章名称";
    bc.DataField = "scmc";
    this.dgrResult.Columns.Add(bc); bc = new BoundColumn();
    bc.HeaderText = "浏览次数";
    bc.DataField = "cs";
    this.dgrResult.Columns.Add(bc);
    }
    }
    }
    }
    你可以看一看,不知道对你是否有帮助!-
      

  7.   

    我这样绑定
    第一步:
    DataGrid1.DataSource = dt_Obligate.DefaultView
    DataGrid1.DataBind()
    DataGrid1.AutoGenerateColumns = False
    第二步:
            Dim col = New BoundColumn()
            col = New BoundColumn()
            col.HeaderText = "客户id"
            col.HeaderStyle.HorizontalAlign = HorizontalAlign.Center
            col.HeaderStyle.Width = New Unit(100)
            col.HeaderStyle.Wrap = False
            col.ItemStyle.Wrap = True
            col.DataField = "id"
            DataGrid1.Columns.Add(col)
    如果将第二步的代码放在Page_Load事件的时候。col.HeaderText = "客户id"这句话不起作用。(原来dataSet中有5列,显示5列)
    如果放在Page_Init事件中,显示的结果是在原来dataSet数据中,多了刚才添加的一列,就是说DataSet中本来显示5列,现在显示6列请问你,第二步是放在那里?
      

  8.   

    很简单,你的顺序颠倒了!第二步:
            Dim col = New BoundColumn()
            col = New BoundColumn()
            col.HeaderText = "客户id"
            col.HeaderStyle.HorizontalAlign = HorizontalAlign.Center
            col.HeaderStyle.Width = New Unit(100)
            col.HeaderStyle.Wrap = False
            col.ItemStyle.Wrap = True
            col.DataField = "id"
            DataGrid1.Columns.Add(col)
    我这样绑定
    第一步:
    DataGrid1.DataSource = dt_Obligate.DefaultView
    DataGrid1.DataBind()
      

  9.   

    按照 niaoren(菜的吐血) 的方法你就可以實現了,的確是順序給搞錯了。
      

  10.   

    顺序已经更正了,但是问题还在
    原来table 中有5列,用了DataGrid1.Columns.Add(col)之后,是在本来的基础上添加,并不是绑定!!
    我应该怎样做阿?