• 全部
  • .NET Framework
  • ASP
  • Web Services
  • .NET互联网桌面应用
  • VB
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • AppLauncher
  • 问答

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

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;

}
...全文
104 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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)
外做
回复
相关推荐
发帖
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
帖子事件
创建了帖子
2004-10-29 09:25
社区公告
暂无公告