1

在 Page_Load 方法中,我根据各种条件创建了几个控件。我想用这些控件注册服务器端代码。但是,对于最后一部分,我需要将我的控件声明为服务器控件。这通常由 runat=server 完成,但我不知道如何在 C# 代码中设置此属性。myControl.Attributes.Add("runat", "server") 不能解决问题。这一个有效,这意味着当我单击它时会调用“测试”方法:

<asp:LinkButton ID="LinkButton1" runat="server" OnClick="test">testtext</asp:LinkButton>

这个不起作用:

            LinkButton lb = new LinkButton();
            lb.ID = "LinkButton1";
            lb.OnClientClick = "test";
            lb.Text = "testtext";
            lb.Attributes.Add("runat", "server");

我可以点击它,页面已加载,但未调用测试方法。

有什么提示吗?

4

4 回答 4

3

你几乎做对了。只是几件事:

  • 手动实例化服务器控件时,无需添加runat="server"属性。这是一个特殊属性,仅由 ASP.NET 页面解析器用于将服务器控件与其他标记区分开来。
  • 标记中的OnClick属性对应于Click您使用运算符连接的服务器端事件+=。(另一方面,OnClientClick标记中的属性对应于onclick 客户端OnClick属性,它通常包含一段 JavaScript 代码。不对应的事实确实onclick有点令人困惑。)

因此:

LinkButton lb = new LinkButton();
lb.ID = "LinkButton1";
lb.Click += test;
lb.Text = "testtext";

private还有你的事件处理程序(如果没有从标记中引用它,你甚至可以制作它):

protected void test(object sender, EventArgs e)
{
}
于 2012-07-05T03:04:13.277 回答
2

您是否尝试注册服务器端事件?如果是这样,您可以这样做。

LinkButton lb = new LinkButton();
lb.ID = "LinkButton1";
lb.Click += new EventHandler(LinkButton1_Click);
lb.Text = "testtext";

事件

protected void LinkButton1_Click(object sender, EventArgs e)
{ 

}
于 2012-07-05T03:11:55.913 回答
0

你不需要。由于控件是通过 C# 代码在服务器端创建的,因此它们已经是服务器端控件。您遇到的问题与页面生命周期有关:当您像现在一样在服务器端创建控件时,您需要在每次回发时重新添加控件并重新挂钩您想要处理的任何事件处理程序为他们。

另请注意,您的代码显示了 2 个不同的内容:在您发布的标记上,您正在显示OnClick事件的处理程序,而在 C# 代码上,您正在为OnClientClick事件添加处理程序。它们是两种不同的东西。单击控件时,该OnClientClick事件只会触发您页面上的任何 javascript 代码。这与这样做完全相同:

 link.Attributes.Add("onclick","SomeJavascriptFunction();");
于 2012-07-05T02:48:49.820 回答
0

首先,你不需要那条lb.Attributes.Add("runat", "server")线。runat="server"所做的只是使控件对代码隐藏可见。由于您要在代码隐藏中添加控件,因此这是一个有争议的问题。

至于脚本,请注意有效的脚本正在使用OnClick,而您损坏的脚本正在使用OnClientClick。区别很重要,因为OnClickjavascript 本身就可以理解,它会找到具有名称的函数test并执行它。

OnClientClick另一方面,它是 ASP.NET 运行时手动绑定到 click 事件的任意 javascript。意思是,它只是要执行test。没什么。test(),另一方面,是正确的 javascript。

因此,将该行更改为lb.OnClickClick = "test()";

编辑:我把自己搞混了,看看另一个答案。

于 2012-07-05T02:50:53.933 回答