我有一个包含动态创建的命令按钮的页面。
我需要动态连接点击事件,以便我可以获取点击按钮的CommandArgument。
Button b = new Button();
b.ID = "btnTrigger2";
b.CssClass = "hiddenBtn";
b.CommandName = "lbl3";
b.Click += new EventHandler(btnTrigger_Click);
问题是最后一行 - 我无法以这种方式连接EventHandler - 我需要使用标准的EventArgs而不是CommandEventArgs。
任何人都有任何建议让这个工作?必须有办法...
修改
想象一下,我会发布最终有效的代码,以防其他人试图做同样的事情。
`string tabLoadedScript = string.Empty; string postBackScript = string.Empty;
string script = " <script language='javascript' type='text/javascript'>" + System.Environment.NewLine;
script += "function clientActiveTabChanged(sender, args) {" + System.Environment.NewLine;
int i = 0;
foreach(TabPanel tp in tc1.Tabs)
{
Button b = new Button();
b.ID = "btn" + tp.ClientID;
b.CssClass = "hiddenBtn";
b.CommandName = tp.ID;
b.Command += btnTrigger_Click;
this.form1.Controls.Add(b);
AsyncPostBackTrigger trg = new AsyncPostBackTrigger();
trg.ControlID = "btn" + tp.ClientID;
tabLoadedScript += "var isTab" + tp.ClientID + "loaded=$get('" + tp.Controls[0].ClientID + "');" + System.Environment.NewLine;
postBackScript += "if(!isTab" + tp.ClientID + "loaded && sender.get_activeTabIndex() == " + i + ") {" + System.Environment.NewLine;
postBackScript += "__doPostBack('" + b.ClientID + "','');}" + System.Environment.NewLine;
i++;
}
script += tabLoadedScript;
script += postBackScript;
script += "}" + System.Environment.NewLine;
script += "</script>";
this.ClientScript.RegisterClientScriptBlock(this.GetType(),“cs”,script,false);
protected void btnTrigger_Click(object sender,CommandEventArgs e) { System.Threading.Thread.Sleep(2500); Panel ctrl =(Panel)FindControlRecursive(this,“pnl”+ e.CommandName); ctrl.Visible = true; }
public static Control FindControlRecursive(Control Root, string Id)
{
if(Root.ID == Id)
return Root;
foreach(Control Ctl in Root.Controls)
{
Control FoundCtl = FindControlRecursive(Ctl, Id);
if(FoundCtl != null)
return FoundCtl;
}
return null;
}
`
答案 0 :(得分:2)
您仍然可以使用传递给点击处理程序的第一个参数来访问CommandArgument。
类似的东西:
protected void btnTrigger_Click(object sender, EventArgs e)
{
Button btnTrigger = sender as Button;
String commandArgument = btnTrigger.CommandArgument;
.
.
.
.
//Other code....
}
答案 1 :(得分:1)
您需要使用Command事件而不是Click事件。此外,假设您使用的是最新版本的Visual Studio和.Net,则只需更改
中的事件注册即可b.Click += new EventHandler(btnTrigger_Click);
到
b.Command += btnTrigger_Click
委托的显式类型是多余的,将由编译器推断。您现在可以将事件处理程序的签名更改为:
protected void btnTrigger_Click(object sender, CommandEventArgs e)
代码应该可以正常工作。
不幸的是,Visual Studio中的默认代码片段仍会生成此旧式事件侦听器代码。