点击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();
       
       
    }
  
}

解决方案 »

  1.   

    在Button的Click事件里面重新生成GridView,程序生成的控件不保存状态,所以程序不生成,就不会存在的,一般情况下,交互操作,不要采用代码创建GridView
      

  2.   

    我需要动态生成Gridview模板列和创建子button控件,且子button控件的click事件能对gridview操作
      

  3.   

    我从一个178生意经网找到了解决办法:http://www.178syj.com/bloglist.aspx?id=88http://www.178syj.com/bloglist.aspx?id=87但以上方法有些不灵活,希望有高手有更好的方法呈上。
      

  4.   

    if (!IsPostBack)
      {
      // GridView1.DataSource = getDateTable();
      // GridView1.DataBind();
    //为何这边注释掉了?
      }   
      

  5.   

    以下这种方法可以实现,但不知有没更简捷的方法
    动态生成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);
        }
    }