asp.net根据条件动态生成GridView,并动态绑定列,且可对其进行编辑的实现

 根据用户需要,一个页面中,有几个不同的button,点击不同的button,可在下方同一区域产生gridview,(当然他们的gridview是不同的)。之前用MultiView来控制,用了几个view在html中绑定了几个Gridview,然后根据点击的按钮不同,切换不同的view。但总觉得这种方式不爽~~,html代码太多,控制起来很麻烦~!
  于是就想到用这种动态的方式实现。Html中只有一个div,用来放置生成的控件,其他全部在后台实现。
  有一点需要注意:如果是在html中加入的控件,页面回发前后系统都会对其状态和属性做viewstate处理,所以,回发时,根据页面生命周期:页面重新初始化并加载控件实例,而后loadViewstate加载控件属性和状态,之后回发前控件状态重新出现。但是对于动态加载的控件,viewstate记住了他们的属性和状态,但是并没有存储控件本身。所以回发后,控件也就不见了~
  鉴于此,有多种处理办法,但是归根到底,都需要在页面回发时的初始化状态下对动态控件重新加载。我这里所做的是在page_load事件中,对其重新加载的,当然也可以在更早的事件中做。
 说明: 因为是几个不同的加载,所以这里做个一个sign标记(用的static string, 也可以用属性),从而在重新加载的时候判断到底加载哪个gridview.
  废话不多说,看代码:
HTML:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
     <div id="list">
         <asp:Button ID="btngv" runat="server" Text="生成GridView 1" onclick="btngv_Click" />  
         <asp:Button ID="Button1" runat="server" Text="生成GridView 2" onclick="Button1_Click" />
     </div>
     <div id="divshow" runat="server" >
     <%...--在这里放置动态生成的gridview--%>
     </div>
    </div>
    </form>
</body>
</html>
  CS:

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
...{
    GridView gvshow=null;
    public static string sign; 

    protected void Page_Load(object sender, EventArgs e)
    ...{
        if (sign != null) //根据标记符号来判断,重新绑定那个控件
        ...{
            if (sign == "gv1")
                setBind();
            else
                setBind2();
        }
    }

    public void setBind()
    ...{
        DataTable dt = getDataTable();  //获得数据源

         gvshow = new GridView();
        gvshow.Width = Unit.Pixel(700);
      
        gvshow.AutoGenerateColumns = false;
        gvshow.RowEditing += new GridViewEditEventHandler(gvshow_RowEditing); //添加编辑事件
        gvshow.RowDeleting +=new GridViewDeleteEventHandler(gvshow_RowDeleting);
        gvshow.DataSource = dt;

        for (int i = 0; i < dt.Columns.Count; i++)
        ...{
            BoundField bc = new BoundField();
            bc.DataField = dt.Columns[i].ColumnName.ToString();
            bc.HeaderText = dt.Columns[i].Caption.ToString();
            gvshow.Columns.Add(bc);
        }

        CommandField cf = new CommandField();
        cf.ButtonType = ButtonType.Link;
        cf.ShowEditButton = true;
        cf.CausesValidation = false;
        gvshow.Columns.Add(cf);

        CommandField cf2 = new CommandField();
        cf2.ButtonType = ButtonType.Link;
        cf2.ShowDeleteButton = true;
        cf2.CausesValidation = false;    

        gvshow.Columns.Add(cf2);

        gvshow.DataBind();
      
        divshow.Controls.Add(gvshow);
    }
    public void setBind2()
    ...{
        DataTable dt = getDataTable();  //获得数据源

        gvshow = new GridView();
        gvshow.Width = Unit.Pixel(700);

        gvshow.AutoGenerateColumns = false;
        gvshow.RowDeleting +=new GridViewDeleteEventHandler(gvshow_RowDeleting); //添加删除事件
        gvshow.DataSource = dt;

        for (int i = 0; i < dt.Columns.Count; i++)
        ...{
            BoundField bc = new BoundField();
            bc.DataField = dt.Columns[i].ColumnName.ToString();
            bc.HeaderText = dt.Columns[i].Caption.ToString();
            gvshow.Columns.Add(bc);
        }

        CommandField cf = new CommandField();
        cf.ButtonType = ButtonType.Link;
       cf.ShowDeleteButton = true;
        cf.CausesValidation = false;

        gvshow.Columns.Add(cf);

        gvshow.DataBind();

        divshow.Controls.Add(gvshow);
    }

    void gvshow_RowDeleting(object sender, GridViewDeleteEventArgs e)
    ...{
        int i = e.RowIndex;
        Response.Write("delete:" + gvshow.Rows[i].Cells[0].Text.ToString());
    }
    protected void btngv_Click(object sender, EventArgs e)  //条件选择后,点击生成按钮,生成特定的gridview
    ...{
        divshow.Controls.Clear();
        setBind();
        sign = "gv1";
    }

   public void gvshow_RowEditing(object sender, GridViewEditEventArgs e)
    ...{
        int i = e.NewEditIndex;
        string id = gvshow.Rows[i].Cells[0].Text.ToString();

        Response.Write("you want to edit"+id);
    }

    public DataTable getDataTable()
    ...{
        DAL.ISDApp01 cDal = new DAL.ISDApp01();
        string sql = "select * from test";
        DataTable dt = cDal.ExecuteQuery(sql).Tables[0];
        return dt;
    }
    protected void Button1_Click(object sender, EventArgs e)
    ...{
        divshow.Controls.Clear();
        setBind2();
        sign = "gv2";
    }
}

文章出处:http://www.diybl.com/course/4_webprogram/asp.net/netjs/2008520/117330.html

时间: 2024-09-20 01:01:10

asp.net根据条件动态生成GridView,并动态绑定列,且可对其进行编辑的实现的相关文章

动态生成GridView

问题描述 有一个空的GridView,通过后台代码动态绑定列和绑定数据,怎么实现,我用的是三层架构 解决方案 解决方案二:其实你这样的问题,直接搜索GridView绑定就是了.这是GridView的基本用法..<asp:GridViewID="gvShowTenementsInfo"runat="server"><Columns><asp:BoundFieldHeaderText="住户姓名"DataField=&q

dev 根据datatable动态生成gridview

/// <summary> /// 根据datatable动态生成gridview /// </summary> /// <param name="dt"> code列是数据源,name列是显示名称</param> /// <param name="gv"></param> private void GetDynamicView(DataTable dt, GridView gv) { //gv

ASP.NET中如何动态合并GridView单元格?

问题描述 ASP.NET中如何动态合并GridView单元格? 如何将签到员工.所属部门.所属机构合并 解决方案 参考: http://blog.csdn.net/q107770540/article/details/7010526 解决方案二: http://www.educity.cn/develop/688297.html http://blog.csdn.net/energeticsunxiaocong/article/details/8505346

c# winform 怎么动态生成4行3列的lable 当lable大于12个进行翻页显示,并且lable动态增加与减少

问题描述 c#winform怎么动态生成4行3列的lable当lable大于12个进行翻页显示,并且lable动态增加与减少(举例:当数量为9时lable数量是9当数量为10是lable数量为10如何数量减少lable数量也随之减少静态更新) 解决方案 解决方案二: flowLayoutPanel试试这个控件解决方案三: 怎么实现静态刷新啊,每次刷新都是一闪一闪的解决方案四: 还不如直接说你的需求解决方案五: 真心没看懂你的需求解决方案六: 以下代码在vs2013下调试通过.新建一个Window

ASP的多条件动态查询

动态|条件 当用ASP与SQL Server数据库打交道时,查询语句是必不可少的.SQL Server数据库本身提供了丰富的查询语句,但是如何在ASP中实现对SQL Server数据库的多条件动态查询呢?笔者在用ASP开发一个基于SQL Server的网站时,较好地解决了这一问题,本文介绍其中的实现方法. 数据库的定义 在SQL Server中定义一个数据库,名称为"comm_server".在该数据库中定义一个表,表名为"operator",包含如下表所示字段 (

ASP高级学习:数据库动态生成树形目录

一.  目录树的广泛应用   为了这段内容,在百度上搜了搜,内容一大通,相关的竟没有.搜什么搜嘛?用处不是明摆着吗?资源管理器文件夹的管理,论坛中多级论坛的管理,JAVA中的AWT正是缺乏包括树形目录这样的组件才用处受限......谁这么没礼貌,一点面子都不给,叫我怎么讲下去?清了清嗓子:  在我们项目中常常会出现自关联的数据表,从整体看去,整个表就呈现为一个树形数据结构.当我们对这个表进行显示.编辑时,如果不采用好的表现形式,会显得很笨拙,采用树形目录进行管理显然是一个不错的主意.  (斧子抡

ASP.NET中如何动态生成验证码

现在不少网站中都使用了验证码的技术,实现方式也是多种多样,这里主要介绍ASP.NET中可以采用的一种动态生成验证码的方法,可能并不十分完美,但实现难度是属于较低的. 该方法是利用了普通的动态图片生成技术,但比较特别的一点是图片的生成是在一个Page类型的子类的Page_Load方法中执行的.所以Response的ContentType为image/Gif,而非text/html. GraphicalText.aspx.cs代码: using System; using System.Drawin

asp.net如何保存动态生成的控件状态

问题描述 前台代码<asp:RepeaterID="rpt_list"runat="server"OnItemDataBound="rpt_list_ItemDataBound"><ItemTemplate><trbgcolor="#FFF0F5"><tdalign="center"id="td_mc"runat="server&quo

一种根据URL参数条件动态生成URL的方法

最近做了一个产品列表页类似于搜索列表页, 功能比较简单,比搜索页复杂的逻辑在于,生成各个查询条件的URL.我们的链接如下: http://xxx.xxx.xxx/product/list.html?spm=0.0.0.0.fCULEV&noHistoryApi=1&q=洗衣机&start_price=1300&end_price=2300&ppath=6560:98950,2814486;570:24403,2085950&sort=sort-fid&