views:

171

answers:

5

How do I check which LinkButton is clicked in the Page_Load of the page. This is to avoid calls to service so that it only executes what is present in its event.

A: 

Do you mean that you're just trying to keep the Page_Load code from being executed when other post-back events on the page are fired? If that's the case, wrap it in:

if (!IsPostBack)

(IMHO this is a bit of a hack necessitated by the WebForms event model, but it is what it is.)

Or am I misunderstanding your question?

As for identifying a specific LinkButton, you can use the CommandName parameter:

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.linkbutton.commandname.aspx

David
A: 

I used to have to do this, because in event handler it was too late. You could use javascript to write an Id of the button that was clicked into hidden field. Than you can retrieve it in the Page_Load. Other way would be to look into _EVENTTARGET hidden field if I remember correctly, it's been a while.

epitka
A: 

You could also declare a variable of type LinkButton (or Control, or whatever) and have the button(s) update that with a reference to themselves in the click event, then check the value at Load.

Superstringcheese
+4  A: 

The only thing that should be running in your Page_Load is the code you want to happen always with everyt request, OR have the code that you only want to run once wrapped in a post back check. For example:

protected void Page_Load(object sender, EventArgs e)
{
    // Put the all code you need to run with EVERY request here

    // Then add a post back check for any code you want to ONLY run on the very
    // first request to the page.
    if (!IsPostBack)
    {
        // Code you only want to run the first time.  Usually setup code to initalize
        // DropDownLists, Grids or pre populate a form, etc...
    }
}

Your LinkButton code should be all on it's own in a click handler:

protected void yourLinkButton_Click(object sender, EventArgs e)
{
    // code you want to execute when your button is clicked.  This will run AFTER
    // the Page_Load has finished.
}

Now if your LinkButton is used in a GridView, Repeater or some type of control that requires binding to fill it in, then you will probably need to implement a RowCommand event handler to figure out which LinkButton is pressed. You can also bind data to it's CommandArgument property to pass some unique row specific data to the even handler.

If you have a bunch of LinkButtons all using the exact same handler, the worst case scenario is to cast the sender and then compare ID values.

protected void yourLinkButton_Click(object sender, EventArgs e)
{
    LinkButton btn = (LinkButton)(sender);
    if (btn.ID.Equals("Some control name you want to compare"))
    {
        // do something
    }
}

If I am way off the mark on your question, just leave a comment and I will try and sort it out.

EDIT: Based on your comment it sounds like you have to know which Button it is in the Page_Load due to some other constraints. Well there is no clean way of doing it in the Page_Load but it can be done. You will need to check the Request.Form keys and check for a specific button name (only the Button that was clicked should be included in the keys). For example:

if (Request.Form.AllKeys.Contains("yourButton1"))
{
    // then do something based on yourButton1
}
else if (Request.Form.AllKeys.Contains("yourButton2"))
{
    // then do something based on yourButton2
}
// etc...

I don't think the is any other clean way to get around it. It would have been nice if the framework included the control that caused the postback in one of the sender properties.

Another Edit: This totally slipped my mind. The above edit it was you need to do for a Button since it does not populate __EVENTTARGET. Since you are using a LinkButton you can use the following to get what control caused the post back:

string controlNameThatCausedPostBack = Request.Form["__EVENTTARGET"];

I have tested this with a LinkButton and it does work as expected.

Hope that finally solves your problem :)

Kelsey
Thanks Kelsey for details answer. I would have implemented in same way .. Problem is in my page i am doing pagination in page load and checking for some hidden field value ... i Know its very bad design but it was already implemented so can't change it
prakash
@prakash I have updated my answer to hopefully include some code that should get you up and running. Let me know if you need more help.
Kelsey
Thanks for giving your time Kelsey , but the problem is LinkButton won't come up in the Request param as fat my knoledge only buttons id comes in the request parameters. Please advice
prakash
A: 

Separate handlers are the way to go here, but you could give each button a unique ItemCommand property, filter on those as necessary.

Wyatt Barnett