为什么我动态生成的按扭的自定义事件不能完全执行

pcgreen 2004-10-29 09:25:40
以下是我的源码,自定义事件可生成按扭,但就不能隐藏Panel3,为什么?


protected System.Web.UI.WebControls.Panel Panel2;
protected System.Web.UI.WebControls.TextBox TextBox1;
protected System.Web.UI.WebControls.Panel Panel3;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if (!IsPostBack)
{
Session["a"] = null;

Panel Panel1 = new Panel();
Panel1.ID = "p1";
for (int k=0;k<5;k++)
{
AddButtonToNavigator(Panel1,k.ToString());
}
Panel2.Controls.Add(Panel1);
Session["a"] = Panel1;
}
else
{
Panel Panel1 = (Panel)Session["a"];
Panel1.ID = "p1";
for (int k=0;k<5;k++)
{
AddButtonToNavigator(Panel1,k.ToString());
}
Panel2.Controls.Add(Panel1);
}

}

private void AddButtonToNavigator(Panel _panel,string _stepid)
{
Button button1 = new Button();
button1.Command +=new CommandEventHandler(this.btnNav_Click);
button1.Text = "Button" + _stepid;
button1.CommandName = _stepid;
_panel.Controls.Add(button1);
_panel.Controls.Add(new LiteralControl(" —— "));

}

private void btnNav_Click(object sender,CommandEventArgs e)
{
Panel Panel1 = (Panel)Session["a"];

if (Panel1.HasControls())
{
Panel1.Controls.Clear();
}
for (int k=0;k<5;k++)
{
AddButtonToNavigator(Panel1,k.ToString() + "abc");
}
Panel3.Visible = false;

}
...全文
154 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
goody9807 2004-10-29
  • 打赏
  • 举报
回复
这几天有几人在问类似的问题,“动态加载控件,为什么控件事件不能触发了?”,问题是他们都是在

if (!IsPostBack)
{
//动态产生或装载控件
//也许需要连接控件事件处理函数
//加到父控件的Controls
}

里生成或装载了动态控件。当控件在客户端触发,postback到服务器端时,IsPostBack==true,这些控件没有被重新生成,怎么能触发事件?所以答案是,当你需要动态生成或装载控件时,应该在if (!IsPostBack)之外做。我问为什么想在if (!IsPostBack)之内做呢?回答是想只生成一次,跟在ASPX页面里一样

<form id="form1" runat=server>
<asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>

#%&%#&%^#&,你怎么会认为这个控件只生成一次呢?这些玩意也不是魔术,想生成一个Button对象,你需要用

Button btn = new Button();

需要触发它的Click事件,你需要用

btn.Click += new EventHandler(YourHandler);

即使象包含

<asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>

的页面,它也是被转化成C#或VB文件,编译成assembly,然后再被执行的啊

不信?加一个页面,TestControls.aspx:

<%@ Page Debug="true" %>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SqlClient"%>

<form id="form1" runat=server>
<asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="false" GridLines="Both">
<Columns>
<asp:TemplateColumn HeaderText="Name">
<ItemTemplate><%# DataBinder.Eval(Container.DataItem,"Name")%></ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
</form>
<script language="C#" runat="server">
void Button_Click(Object sender, EventArgs e)
{
Button btn = (Button)sender;
Response.Write(btn.Text + " is clicked<BR>");
}

void Page_Load(Object sender, EventArgs e)
{

Button btn = new Button();
btn.ID = "Button2";
btn.Text = "Button2";
btn.Click += new EventHandler(Button_Click);
form1.Controls.Add(btn);
if (!IsPostBack)
{
SqlDataAdapter da = new SqlDataAdapter("select Name=au_fname + ' ' + au_lname from authors", "server=localhost;database=pubs;uid=sa;pwd=;");
DataTable dt = new DataTable();
da.Fill(dt);
DataGrid1.DataSource = dt.DefaultView;
DataGrid1.DataBind();
}

//}//这是故意的

</script>

把最后一个“}”注释掉,然后在浏览器里向你的服务器调用TestControls.aspx
pcgreen 2004-10-29
  • 打赏
  • 举报
回复
Panel3并不是放置我动态生成的控件,它只放一个静态控件
rickjelly2004 2004-10-29
  • 打赏
  • 举报
回复
你不信的话,你可以调试一下,你在一个PANEL中放几个控件,然后你在设计的时候就把PANEL的VISBLE设置成FALSE,你在看看里面的控件的VISBLE,还有你在把里面的控件VISBLE设置成TRUE,是设不成的
只有一个办法,就是到HTML中把控件的VISBLE=FALSE这一句删除掉,就好了,就可以看见控件了,不过你稍微改一下控件,它又会把VIBLE设置成FALSE,呵呵
rickjelly2004 2004-10-29
  • 打赏
  • 举报
回复
Panel3.Visible = false
的时候,PANEL3中所有的控件的VISBLE都等于FALSE,
也就是说PANEL3中所有的控件都不创建了,还说什么事件 呢????
所以一般PANEL设置成FALSE的时候就要注意这一点
denoxo 2004-10-29
  • 打赏
  • 举报
回复
其实我是要在自定义控件中重新生成按扭,每一次点击增加一个按扭或是减少一个按扭,所要隐藏的办法解决不了.
其实我在(!IsPostBack)是里面和外面都有动态生成控件,并且我的btnNav_Click每一次都是有效的,只是做到最后一步Panel3.Visible = false;就没效了,弄不明白

brightheroes 2004-10-29
  • 打赏
  • 举报
回复
要干什么用?
感觉代码很奇怪
Web下面尽量不要用动态的,麻烦的要死
还不如弄个隐藏按钮,根据条件来显示呢
其次,如rickjelly2004(rick & jelly)所言
页面PostBack,动态控件丢失,所以要在
if (!IsPostBack)
外面重新生成你的动态控件
amendajing 2004-10-29
  • 打赏
  • 举报
回复
没有用过!学习!
rickjelly2004 2004-10-29
  • 打赏
  • 举报
回复
还有你的CLICK写的和不好,写了CLICK还把控件清除,然后在加事件
rickjelly2004 2004-10-29
  • 打赏
  • 举报
回复
首先你要放在if (!IsPostBack)
外做

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧