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中就不行了了??
试了很多种方法,也百度谷歌了两天也没找到原因!望各位高手帮帮忙讨论下
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中就不行了了??
试了很多种方法,也百度谷歌了两天也没找到原因!望各位高手帮帮忙讨论下
UpdatePanel1.Update();若要刷新UpdatePanel2,则:
UpdatePanel2.Update();所要注意的是,设置UpdatePanel的UpdateMode为Always试试!!
你这个是关于UpdatePanel的幻觉。删除你的UpdatePanel,保留原来放在它内部的“一button按钮——修改”,我相信你就是点击这个按钮来生成LinkButton,也是一样的结果。所以你的问题根本与UpdatePanel无关。
控件添加到updatepanel中
把生成动态控件的代码写在一个函数里面,再让这个函数在page_load里面执行,每次执行button的click事件时候,都会先执行page_load事件的.
5楼所说的将生成LinkButton的函数放在Page_load中执行是可以完成事件绑定执行,但问题是我想让控件在用户点击“修改”按钮后动态地显式出来,而不是每次页面一加载就呈现给用户生成的LinkButton,怎么办呀??有不有什么好方法?可以让绑定的事件执行呀??求教
当你直接在设计页面中用鼠标拖如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
<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>