UpdatePanel中有一button按钮“修改”,单击它服务端动态生成n个LinkButton,并为其绑定单击事件处理函数modify_ques函数,部分源码如下 :        protected bool element_num() {       //此函数在button按钮单击后调用
            int eleNum=temp.Count;
            if (eleNum == 0) {
                wantTell.Visible = true;
                return false;
            }
            wantTell.Visible = false;
            LinkButton eleLink;
            for (int i = 0; i !=eleNum; i++) {
                eleLink = new LinkButton();
                eleLink.ID = "eleLink" + (i + 1).ToString();
                eleLink.PostBackUrl = "";
                eleLink.Text = "[" + (i + 1).ToString() + "]";
                eleLink.CommandArgument = i.ToString();           //命令参数
                eleLink.Command += new CommandEventHandler(this.modify_ques);  //绑定单击事件处理函数
                changeNumPanel.Controls.Add(eleLink);               //changeNumPanel为一个placeHolder控件
                changeNumPanel.Controls.Add(new LiteralControl("     "));
            }
            return true;
        
        }
 protected void modify_ques(object sender, CommandEventArgs e)
        {
            //ScriptManager.RegisterStartupScript(this, this.GetType(), "myscript", "alert('所填项不满足基本要求!');", true);
            Label1.Text = "5555222";
        }单击生成的LinkButton也能刷新updatePanel控件中所有内容,但就是不调用为其绑定的函数!
如果把生成LinkButton的代码放到Page_load中是可以完全正常的,生成的LinkButton单击也有效果,但为什么放在update中就不行了了??
试了很多种方法,也百度谷歌了两天也没找到原因!望各位高手帮帮忙讨论下

解决方案 »

  1.   

    在你需要刷新的事件下,若要刷新UpdatePanel1,则:
    UpdatePanel1.Update();若要刷新UpdatePanel2,则:
    UpdatePanel2.Update();所要注意的是,设置UpdatePanel的UpdateMode为Always试试!!
      

  2.   


    你这个是关于UpdatePanel的幻觉。删除你的UpdatePanel,保留原来放在它内部的“一button按钮——修改”,我相信你就是点击这个按钮来生成LinkButton,也是一样的结果。所以你的问题根本与UpdatePanel无关。
      

  3.   

    回答问题要查资料?用《Csdn收音机》可以最快速度搞定!
      

  4.   

    添加AsyncPostBackTrigger 
    控件添加到updatepanel中
    把生成动态控件的代码写在一个函数里面,再让这个函数在page_load里面执行,每次执行button的click事件时候,都会先执行page_load事件的.
      

  5.   

    说中了,按钮放在UpdatePanel外面,点击它造成整页刷新,绑定的事件也没执行!!
    5楼所说的将生成LinkButton的函数放在Page_load中执行是可以完成事件绑定执行,但问题是我想让控件在用户点击“修改”按钮后动态地显式出来,而不是每次页面一加载就呈现给用户生成的LinkButton,怎么办呀??有不有什么好方法?可以让绑定的事件执行呀??求教
      

  6.   


    当你直接在设计页面中用鼠标拖如Button,它并不是静止在所谓页面上。在asp.net的页面声明周期中,每当客户端访问页面,asp.net才重建这个页面的对象实例,此时在页面的声明周期中的Init阶段之前,会重建你在设计页面上所声明的所有控件。然而,当你是使用代码动态增加的控件,那么重建控件的责任应该是你的代码来完成,但是你并没有在回发时重建那些动态增加的Button,那么当然asp.net也就找不到事件所依赖的控件实体,也就不会去触发事件。所以你需要在page_load中去重建所有动态产生的Button,这样asp.net就知道该处触发哪一个控件的事件了。我写一个简单的demo(我只是在ide是上敲入,没有执行它,可能有bug,理解意思就好):<%@ Page Language="C#" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <script runat="server">    private int NextButtonID
        {
            get
            {
                return (int)(ViewState["btn_id"] ?? 0);
            }
            set
            {
                ViewState["btn_id"] = value;
            }
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            CreateButton(true, NextButtonID++);
        }    private void CreateButton(bool isPageLoaded, int id)
        {
            var bag = new Panel();
            bag.ID = "bag_" + id.ToString();
            var btn = new LinkButton();
            btn.ID = "lnk_" + id.ToString();
            btn.Click += new EventHandler(btn_Click);
            var txt = new TextBox();
            txt.ID = "txt_" + id.ToString();
            var del = new Button();
            del.Click += new EventHandler(del_Click);
            this.PlaceHolder1.Controls.Add(txt);
            this.PlaceHolder1.Controls.Add(btn);
            if (!isPageLoaded)   // 当isPageLoaded为true的时候,不需要初始化状态值,asp.net会自动维系控件的状态值。
            {
                txt.Text = "请在这里随随便输入一些内容";
                btn.Text = "刚刚创建的按钮";
                btn.Attributes["对应的id"] = id.ToString();
                txt.Attributes["水印状态"] = "1";
                txt.Attributes["keydown"] = "if(this.水印状态==1){this.value='';this.水印状态=0;";
                del.Attributes["对应的id"] = id.ToString();
                del.Text = "删除这一行";
                未被删除的id.Add(id);
            }
        }    void btn_Click(object sender, EventArgs e)
        {
            var lnk = (LinkButton)sender;
            lnk.Text = string.Format("最后点击时间:{0}", DateTime.Now.ToString());
            var input = (TextBox)this.FindControl("txt" + lnk.Attributes["对应的id"]);
            Page.ClientScript.RegisterStartupScript(lnk.GetType(), "clicked",
                string.Format("alert('{0}');", input.Text.Replace("'", "\\'")), true);
        }    void del_Click(object sender, EventArgs e)
        {
            var btn = (Button)sender;
            var bag = (Panel)btn.FindControl("bag_" + btn.Attributes["对应的id"]);
            bag.Parent.Controls.Remove(bag);
            未被删除的id.Remove(int.Parse(btn.Attributes["对应的id"]));
        }    List<int> 未被删除的id
        {
            get
            {
                return (List<int>)(ViewState["ids"] ?? new List<int>());
            }
        }    protected void Page_Load(object sender, EventArgs e)
        {
            foreach (var id in 未被删除的id)     //这里必须重建所有动态生成的子控件,asp.net并不会给你重建
                CreateButton(false, id);        //isPageLoaded为false表示不需要初始化状态值,asp.net会自动回填上次输出html时的状态值
        }
    </script>
    <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>
        <br />
        <asp:Button ID="Button1" runat="server" Text="增加一行" OnClick="Button1_Click" />
        </form>
    </body>
    </html>
     
    另外,我以前写过一个动态加载ascx的demo:http://topic.csdn.net/u/20090923/12/ce7c0782-69b3-421c-93e1-a51a00097d57.html
      

  7.   

    实际上,对于这类数据集合驱动的界面,最好还是选择Repeater、DataList、GridView、ListView等控件,代码更加简单直接。
      

  8.   

    嗯,得空,找了一下上面的demo中的bug,并且改为asp.net ajax的,可执行的版本<%@ Page Language="C#" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <script runat="server">    private int NextButtonID
        {
            get
            {
                return (int)(ViewState["btn_id"] ?? 0);
            }
            set
            {
                ViewState["btn_id"] = value;
            }
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            CreateButton(true, NextButtonID++);
        }    private void CreateButton(bool isPageLoaded, int id)
        {
            var bag = new Panel();
            bag.ID = "bag_" + id.ToString();
            var btn = new LinkButton();
            btn.ID = "lnk_" + id.ToString();
            btn.Click += new EventHandler(btn_Click);
            var txt = new TextBox();
            txt.ID = "txt_" + id.ToString();
            var del = new Button();
            del.Click += new EventHandler(del_Click);
            bag.Controls.Add(txt);
            bag.Controls.Add(btn);
            bag.Controls.Add(del);
            this.PlaceHolder1.Controls.Add(bag);
            if (isPageLoaded)   // 当isPageLoaded为false,不需要初始化状态值,asp.net会自动维系控件的状态值。
            {
                txt.Text = "请在这里随随便输入一些内容";
                btn.Text = "刚刚创建的按钮";
                btn.Attributes["对应的id"] = id.ToString();
                txt.Attributes["水印状态"] = "1";
                txt.Attributes["onkeydown"] = "if(this.水印状态==1){this.value='';this.水印状态=0;}";
                del.Attributes["对应的id"] = id.ToString();
                del.Text = "删除这一行";
                未被删除的id.Add(id);
            }
        }    void btn_Click(object sender, EventArgs e)
        {
            var lnk = (LinkButton)sender;
            lnk.Text = string.Format("最后点击时间:{0}", DateTime.Now.ToString());
            var input = (TextBox)this.FindControl("txt_" + lnk.Attributes["对应的id"]);
            ScriptManager.RegisterStartupScript(this.Page, lnk.GetType(), "clicked",
                 string.Format("alert('{0}');", input.Text.Replace("'", "\\'")), true);
        }    void del_Click(object sender, EventArgs e)
        {
            var btn = (Button)sender;
            var bag = (Panel)btn.FindControl("bag_" + btn.Attributes["对应的id"]);
            bag.Parent.Controls.Remove(bag);
            未被删除的id.Remove(int.Parse(btn.Attributes["对应的id"]));
        }    List<int> 未被删除的id
        {
            get
            {
                var lst = ViewState["ids"];
                if (lst == null)
                {
                    lst = new List<int>();
                    ViewState["ids"] = lst;
                }
                return (List<int>)lst;
            }
        }    protected void Page_Load(object sender, EventArgs e)
        {
            foreach (var id in 未被删除的id)     //这里必须重建所有动态生成的子控件,asp.net并不会给你重建
                CreateButton(false, id);        //isPageLoaded为false表示不需要初始化状态值,asp.net会自动回填上次输出html时的状态值
        }
    </script>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
                <br />
                <asp:Button ID="Button1" runat="server" Text="增加一行" OnClick="Button1_Click" />
            </ContentTemplate>
        </asp:UpdatePanel>
        </form>
    </body>
    </html>
      

  9.   

    sp大人发威《Csdn收音机》是个开源的辅助工具,以后学技术更方便了!