ASP.NET动态生成GridView的使用

根据DataTable动态生成包含checkbox的GridView,其中DataTable中对应checkbox那一列的值必须为bool值。

public static GridView DynamicGenerateColumns(GridView gv, DataTable dt)
        {
            // 把GridView的自动产生列设置为false,否则会出现重复列
            gv.AutoGenerateColumns = false;

            // 清空所有的Columns
            gv.Columns.Clear();

            // 遍历DataTable 的每个Columns,然后添加到GridView中去
            foreach (DataColumn item in dt.Columns)
            {
                if (item.ColumnName == "选择")
                {
                    CheckBoxField chCol = new CheckBoxField();
                    chCol.HeaderText = item.ColumnName;
                    chCol.DataField = item.ColumnName;
                    chCol.Visible = true;
                    gv.Columns.Add(chCol);
                    continue;
                }
                BoundField col = new BoundField();
                col.HeaderText = item.ColumnName;
                col.DataField = item.ColumnName;
                col.Visible = true;
                gv.Columns.Add(col);
            }
            return gv;
        }

然后在返回的GridView上绑定dataTable就可以了。还可以添加checkBox点击事件javascript处理函数。

gridView.DataSource = dataTable;
gridView.DataBind();
for (int i = 0; i < ChargingGridView.Rows.Count; i++)
{
       ((System.Web.UI.WebControls.CheckBox)(gridView.Rows[i].Cells[0].Controls[0])).Attributes.Add("onclick", "OnClickCheck()");
}

在JS函数中对GridView中checkbox的处理,注意下面的Javascript代码是如何获取checkbox及其它普通元素的的值。

//该函数实现了根据选择的checkbox计算某列的值总和的功能
function OnClickCheck() {
    var sumValue=0;
    var gv = document.getElementById("<%=gridView.ClientID%>");
    for (var i = 1; i < gv.rows.length; i++) {
        if (gv.rows[i].cells[0].children[0].checked == false) {
            continue;
        }
        sumValue = sumValue + parseFloat(gv.rows[i].cells[5].innerText);
    }
    document.getElementById(‘<%=TotalLabel.ClientID%>‘).innerHTML = sumValue;
}

上面的代码在后端用C#实现如下,

private void OnClickCheck()
{
    double totalAmount = 0;

    for (int i = 0; i < gridView.Rows.Count; i++)
    {
        if (false == ((System.Web.UI.WebControls.CheckBox)(ChargingGridView.Rows[i].Cells[0].Controls[0])).Checked)
        {
            continue;
        }
        totalAmount += Convert.ToDouble(gridView.Rows[i].Cells[6].Text.Trim());
    }

    TotalLabel.Text = totalAmount.ToString();
}

SQL SERVER中bool的字段类型为bit,如果bool值是从DataTable取出的,则不用修改,如果该列bool值是在select返回的结果上添加的一列固定值,那么就需要在返回的DataTable前添加一列:

dataTable.Columns.Add("选择", typeof(bool));
dataTable.Columns["选择"].SetOrdinal(0);
foreach (DataRow dr in ChargeItemDataTable.Rows)
{
       dr["选择"] = true;//初始化checkbox为选中
}

关于在select返回的结果添加一列固定值,如果添加这一列是字符串或数值类型,那么直接在select语句中即可设置,如select ‘吴宗宪‘ as hostName,age from showhosts。但如果是bool值的话,就不能select true as 选择……,这样SQL会报错,要照上面的方法来添加。

现在还有个问题,就是生成的GridView中的checkbox是灰色的,不能操作,也就是enable为false。现在需要绑定GridView_RowDataBound函数,在该函数中设置checkBox的enabled为true。添加该函数过程为:在aspx页面设计页中,选中GridView,右边属性栏中选择事件,在下面找到RowDataBound,生成事件处理函数。

protected void gridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
     if (e.Row.Cells[0].GetType() == typeof(System.Web.UI.WebControls.DataControlFieldCell))
     {
           TableCell tc = e.Row.Cells[0];
           if (tc.Controls.Count > 0)
           {
                System.Web.UI.WebControls.CheckBox cb = (System.Web.UI.WebControls.CheckBox)tc.Controls[0];
                if (!(cb == null))
                {
                        cb.Enabled = true;
                }
           }
      }
}

有时候需要把GridView转换成DataTable:

public static DataTable GetDataTableFromGridView(GridView gv, DataTable dt)
{
    GridViewRow headerRow = gv.HeaderRow;
    int columnCount = headerRow.Cells.Count;
    for (int i = 0; i < columnCount; i++)
    {
        DataColumn dc = dt.Columns.Add();
        dc.ColumnName = headerRow.Cells[i].Text.Trim();
        if ("选择" == headerRow.Cells[i].Text.Trim())
        {
            dc.DataType = typeof(bool);
        }
        else
        {
            dc.DataType = typeof(string);
        }
    }

    for (int i = 0; i < gv.Rows.Count; i++)
    {
        DataRow dr = dt.NewRow();

        for (int j = 0; j < gv.Columns.Count; j++)
        {
            if ("选择" == headerRow.Cells[j].Text.Trim())
            {
                if (true == ((System.Web.UI.WebControls.CheckBox)(gv.Rows[i].Cells[j].Controls[0])).Checked)
                {
                    dr[j] = true;
                }
                else
                {
                    dr[j] = false;
                }
            }
            else if (gv.Rows[i].Cells[j].Text.Trim() == "&nbsp;")
            {
                dr[j] = "";
            }
            else
            {
                dr[j] = gv.Rows[i].Cells[j].Text.Trim();
            }
        }

        dt.Rows.Add(dr);
    }
    return dt;
}
时间: 2024-10-04 18:19:23

ASP.NET动态生成GridView的使用的相关文章

asp.net动态添加GridView的模板列,并获取列值

一.动态添加模板列: 1.建立模板列样式: 说明:下边代码可以直接写在aspx文件中,也可以单独建立cs文件:另外,我没有写button.linkButton等控件,意思差不多,不过当需要添加事件时,记得将事件名称传入,并附加在控件上 public class GridViewTemplate : ITemplate{ /// <summary> /// 模板类型:标题或内容: /// DataControlRowType.Header和DataControlRowType.DataRow /

后台动态生成GridView列和模版

考虑到很多数据源是不确定的,所以这时无法在前台设置gridview的表头,需要在后台动态指定并绑定数据. 前台代码如下: <%@ Page Title="主页" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default&qu

asp.net动态生成按钮Button控件

1.动态生成button控件及响应服务端和客户端事件 void BindButtons(){ foreach (var item in items) { Button Btn = new Button(); Btn.OnClientClick = "showLoading();return true;"; //客户端事件 //Btn.Attributes.Add("OnClientClick ", "this.disabled=true;return tr

ASP.Net动态创建GridView

1.创建Field BoundField requestitem = new BoundField();//注意Field可以是ButtonField,TemplateField,...等等GridView支持的Field 2.添加Field requestitem.DataField requestItem.DataField = dataField; //dataField指的得是绑定的数据源中定义的某个字段的名字,比如数据源为DataSet,包含一个数据表,数据表中包含一行名字为"ID&q

Asp.net动态生成表单

control.ascx ? 1 2 3 4 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="control.ascx.cs" Inherits="WebApplication1.control" %>   <asp:Panel ID="Panel1" runat="server"><

asp.net一般处理程序(.ashx)动态生成验证码案例。

{使用一般处理程序动态生成验证码} 1.新建WebSite项目,添加一般处理程序命名为  yzm.ashx,添加如下代码: public void ProcessRequest(HttpContext context)    {   //将context.Response.ContentType = "text/plain";修改为context.Response.ContentType = "image/JPEG";        context.Response

动态生成页面(一)——ASP.NET中Literal使用

在页面中加入内容时,假设是静态内容.无需使用容器,能够直接将标记作为HTML直接加入到页面中:可是,假设是动态内容,则必须借助容器将内容加入到页面中.典型的容器有:Label控件.Literal控件.Panel控件和PlaceHolder控件. 一.控件选择:Literal Literal控件与Lable控件的差别在于,Literal控件不向文本中加入不论什么HTML元素:而Label控件呈现一个span元素. Panel和PlaceHolder控件呈现为DIV元素.这将在页面上创建离散块,与L

ABP(现代ASP.NET样板开发框架)系列之20、ABP展现层——动态生成WebApi

点这里进入ABP系列文章总目录 ABP(现代ASP.NET样板开发框架)系列之20.ABP展现层——动态生成WebApi ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 建立动态WebApi控制器 Abp框架能够通过应用层自动生成web api: pu

ASP.NET中Literal使用——动态生成页面

在页面中添加内容时,如果是静态内容,无需使用容器,可以直接将标记作为HTML直接添加到页面中:但是,如果是动态内容,则必须借助容器将内容添加到页面中.典型的容器有:Label控件.Literal控件.Panel控件和PlaceHolder控件. 一.控件选择:Literal Literal控件与Lable控件的区别在于,Literal控件不向文本中添加任何HTML元素:而Label控件呈现一个span元素. Panel和PlaceHolder控件呈现为DIV元素,这将在页面上创建离散块,与Lab