点击button1按钮,动态生成gridview 的子 button控件,点击子button控件执行一个提示信息操作。。
但我执行子button单击事件后,gridview绑定的数据不见了,gridview显示为空了。
如果把Button1_Click中的代码放在OnInit中就可正常执行,但我不希望网页一打开,就执行生成子 button控件且事件操作,而是希望点击Button1后生成子 button控件且事件操作。
代码如下。不知哪儿出错了,望高手指点?
aspx代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="UserUI_test" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head><body>
<form id="form1" runat="server">
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
<asp:gridview ID="GridView1" runat="server" AutoGenerateColumns="False"></asp:gridview>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
</form>
</body>
</html>cs代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
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;public partial class UserUI_test : System.Web.UI.Page
{
private DataTable getDateTable()
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
dt.Columns.Add(new DataColumn("Name", typeof(String)));
DataRow dr = dt.NewRow();
dr[0] = 1;
dr[1] = "01";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 2;
dr[1] = "01011";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 3;
dr[1] = "0120";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 4;
dr[1] = "01001";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 5;
dr[1] = "0105";
dt.Rows.Add(dr);
return dt;
} protected override void OnInit(EventArgs e)
{
//TemplateField customField = new TemplateField(); //customField.ShowHeader = true;
//customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, "动态添加列2");
// GridViewTemplate gvt = new GridViewTemplate(DataControlRowType.DataRow, "lbtn", "Name");
// gvt.eh += new GridViewTemplate.EventHandler(lbtn_Click);
// customField.ItemTemplate = gvt;
// GridView1.Columns.Add(customField);
// base.OnInit(e);
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// GridView1.DataSource = getDateTable();
// GridView1.DataBind();
} }
public void lbtn_Click(object sender, EventArgs e)
{
Alert("test");
}
public class GridViewTemplate : ITemplate
{
public delegate void EventHandler(object sender, EventArgs e);
public event EventHandler eh; private DataControlRowType templateType; private string columnName;
private string controlID; public GridViewTemplate(DataControlRowType type, string colname)
{ templateType = type; columnName = colname; }
public GridViewTemplate(DataControlRowType type, string controlID, string colname)
{
templateType = type;
this.controlID = controlID;
columnName = colname;
}
public void InstantiateIn(System.Web.UI.Control container)
{
switch (templateType)
{
case DataControlRowType.Header:
Literal lc = new Literal();
lc.Text = columnName;
container.Controls.Add(lc);
break;
case DataControlRowType.DataRow:
LinkButton lbtn = new LinkButton();
lbtn.ID = this.controlID;
if (eh != null)
{
lbtn.Click += new System.EventHandler(eh);
}
lbtn.DataBinding += new System.EventHandler(lbtn_DataBinding); container.Controls.Add(lbtn); break;
default:
break;
}
}
void lbtn_DataBinding(object sender, EventArgs e)
{
LinkButton lbtn = sender as LinkButton;
if (lbtn != null)
{
GridViewRow container = lbtn.NamingContainer as GridViewRow;
if (container != null)
{
object dataValue = DataBinder.Eval(container.DataItem, columnName);
if (dataValue != DBNull.Value)
{
lbtn.Text = dataValue.ToString();
}
}
}
}
}
public void Alert(string msg)
{
this.ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('" + msg + "');", true);
}
protected void Button1_Click(object sender, EventArgs e)
{
TemplateField customField = new TemplateField(); customField.ShowHeader = true;
customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, "动态添加列");
GridViewTemplate gvt = new GridViewTemplate(DataControlRowType.DataRow, "lbtn", "Name");
gvt.eh += new GridViewTemplate.EventHandler(lbtn_Click);
customField.ItemTemplate = gvt;
GridView1.Columns.Add(customField);
GridView1.DataSource = getDateTable();
GridView1.DataBind();
}
}
但我执行子button单击事件后,gridview绑定的数据不见了,gridview显示为空了。
如果把Button1_Click中的代码放在OnInit中就可正常执行,但我不希望网页一打开,就执行生成子 button控件且事件操作,而是希望点击Button1后生成子 button控件且事件操作。
代码如下。不知哪儿出错了,望高手指点?
aspx代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="UserUI_test" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head><body>
<form id="form1" runat="server">
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
<asp:gridview ID="GridView1" runat="server" AutoGenerateColumns="False"></asp:gridview>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
</form>
</body>
</html>cs代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
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;public partial class UserUI_test : System.Web.UI.Page
{
private DataTable getDateTable()
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
dt.Columns.Add(new DataColumn("Name", typeof(String)));
DataRow dr = dt.NewRow();
dr[0] = 1;
dr[1] = "01";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 2;
dr[1] = "01011";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 3;
dr[1] = "0120";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 4;
dr[1] = "01001";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 5;
dr[1] = "0105";
dt.Rows.Add(dr);
return dt;
} protected override void OnInit(EventArgs e)
{
//TemplateField customField = new TemplateField(); //customField.ShowHeader = true;
//customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, "动态添加列2");
// GridViewTemplate gvt = new GridViewTemplate(DataControlRowType.DataRow, "lbtn", "Name");
// gvt.eh += new GridViewTemplate.EventHandler(lbtn_Click);
// customField.ItemTemplate = gvt;
// GridView1.Columns.Add(customField);
// base.OnInit(e);
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// GridView1.DataSource = getDateTable();
// GridView1.DataBind();
} }
public void lbtn_Click(object sender, EventArgs e)
{
Alert("test");
}
public class GridViewTemplate : ITemplate
{
public delegate void EventHandler(object sender, EventArgs e);
public event EventHandler eh; private DataControlRowType templateType; private string columnName;
private string controlID; public GridViewTemplate(DataControlRowType type, string colname)
{ templateType = type; columnName = colname; }
public GridViewTemplate(DataControlRowType type, string controlID, string colname)
{
templateType = type;
this.controlID = controlID;
columnName = colname;
}
public void InstantiateIn(System.Web.UI.Control container)
{
switch (templateType)
{
case DataControlRowType.Header:
Literal lc = new Literal();
lc.Text = columnName;
container.Controls.Add(lc);
break;
case DataControlRowType.DataRow:
LinkButton lbtn = new LinkButton();
lbtn.ID = this.controlID;
if (eh != null)
{
lbtn.Click += new System.EventHandler(eh);
}
lbtn.DataBinding += new System.EventHandler(lbtn_DataBinding); container.Controls.Add(lbtn); break;
default:
break;
}
}
void lbtn_DataBinding(object sender, EventArgs e)
{
LinkButton lbtn = sender as LinkButton;
if (lbtn != null)
{
GridViewRow container = lbtn.NamingContainer as GridViewRow;
if (container != null)
{
object dataValue = DataBinder.Eval(container.DataItem, columnName);
if (dataValue != DBNull.Value)
{
lbtn.Text = dataValue.ToString();
}
}
}
}
}
public void Alert(string msg)
{
this.ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('" + msg + "');", true);
}
protected void Button1_Click(object sender, EventArgs e)
{
TemplateField customField = new TemplateField(); customField.ShowHeader = true;
customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, "动态添加列");
GridViewTemplate gvt = new GridViewTemplate(DataControlRowType.DataRow, "lbtn", "Name");
gvt.eh += new GridViewTemplate.EventHandler(lbtn_Click);
customField.ItemTemplate = gvt;
GridView1.Columns.Add(customField);
GridView1.DataSource = getDateTable();
GridView1.DataBind();
}
}
{
// GridView1.DataSource = getDateTable();
// GridView1.DataBind();
//为何这边注释掉了?
}
动态生成Gridview及子控件,并执行子控件事件2012-10-10 22:05:26
来源:http://www.178syj.com/bloglist.aspx?id=87动态生成Gridview及子控件,并执行子控件事件,实现方法源码如下:test1.aspxaspx代码<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test1.aspx.cs" Inherits="UserUI_test1" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
OnRowDataBound="GridView1_RowDataBound" Width="294px" Height="134px"
onrowcommand="GridView1_RowCommand">
<Columns>
<asp:CheckBoxField HeaderText="选择" />
<asp:BoundField DataField="name" HeaderText="Name" />
</Columns>
</asp:GridView>
<asp:Button ID="Button2" runat="server" onclick="Button2_Click" Text="动态生成表" /> </form>
</body>
</html>test1.cscs代码using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;public partial class UserUI_test1 : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
if (Request.QueryString["t"] == "ok")
{
bindselectvalue();
GridView1.DataSource = getDateTable();
GridView1.DataBind();
}
else
{ } }
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
}
}
private DataTable getDateTable()
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
dt.Columns.Add(new DataColumn("Name", typeof(String)));
dt.Columns.Add(new DataColumn("URL", typeof(String)));
DataRow dr = dt.NewRow();
dr[0] = 1;
dr[1] = "数据1";
dr[2] = "链接1";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 2;
dr[1] = "数据2";
dr[2] = "链接2";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 3;
dr[1] = "数据3";
dr[2] = "链接3";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 4;
dr[1] = "数据4";
dr[2] = "链接4";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 5;
dr[1] = "数据5";
dr[2] = "链接5";
dt.Rows.Add(dr);
return dt;
}
#region GridView绑定动态生成的控件
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowIndex > -1)
{
CheckBox check = new CheckBox();
check.ID = e.Row.RowIndex.ToString();
check.AutoPostBack = true;
check.CheckedChanged += new EventHandler(check_CheckedChanged);
e.Row.Cells[0].Controls.Add(check);
}
}
#endregion
#region 处理checkbox所触发的事件
void check_CheckedChanged(object sender, EventArgs e)
{ int i = Convert.ToInt32(((CheckBox)sender).ID);
//TextBox box = this.GridView1.Rows[i].Cells[2].FindControl("txt" + i.ToString()) as TextBox;
// box.Enabled = true; }
#endregion
protected void Button2_Click(object sender, EventArgs e)
{
Response.Redirect("test1.aspx?t=ok");
}
/// <summary>
/// 动态添加数据字段
/// </summary>
void bindselectvalue()
{
ButtonField adup = new ButtonField();
adup.ButtonType = ButtonType.Link;
adup.HeaderText = "广告上架";
adup.CommandName = "shangjia";
adup.DataTextField = "url";
GridView1.Columns.Add(adup);//添加编辑按钮到gridview
GridView1.DataSource = getDateTable();
GridView1.DataBind();
//
}
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "shangjia")
{
Alert("你已提交推荐经销商申请,广告已开通!");
}
}
public void Alert(string msg)
{
this.ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('" + msg + "');", true);
}
}