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";
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值