2

I have a page with a dynamically created command button.

I need to dynamically wire up a click event so I can grab the CommandArgument of the clicked button.

Button b = new Button();
b.ID = "btnTrigger2";
b.CssClass = "hiddenBtn";
b.CommandName = "lbl3";
b.Click += new EventHandler(btnTrigger_Click);

The problem is the last line - I can't wire up an EventHandler this way - I need to use the standard EventArgs instead of CommandEventArgs.

Anyone have any suggestions on getting this to work? There's got to be a way...

EDIT

Figured I'd post the code that finally worked in case anyone else tries to do the same thing.

`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;

    }

`

2 Answers 2

2

You can still access the CommandArgument using the the first argument passed to the click handler.

Something like:

protected void btnTrigger_Click(object sender, EventArgs e)
{
  Button btnTrigger = sender as Button;
  String commandArgument = btnTrigger.CommandArgument;
  .
  .
  .
  .
  //Other code....

}
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you both for the responses! \
1

You need to use the Command event instead of the Click event. Also, assuming you're using a recent version of Visual Studio and .Net, you can simply change the event registration from

b.Click += new EventHandler(btnTrigger_Click);

to

b.Command += btnTrigger_Click

The explicit typing of the delegate is redundant and will be inferred by the compiler. You can now change the signature of your event handler to:

protected void btnTrigger_Click(object sender, CommandEventArgs e)

And the code should work as desired.

Unfortunately, the default code snippets in Visual Studio still generate this old-style event listener code.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.