Using one sub-routine to handle more than one link button click event requires determination of which button click triggered the sub-routine.
I had an existing subroutine handling a link button. Examining the entries in a form, updating a database and sending an email. A second button was required on the form which would update the database but not send the email.
- Clone the sub-routine omitting the email sending
- Two subroutines to handle the click events with each calling a common function where the difference between the two actions is to be determined. Or just the common block of code for saving the form values.
- One subroutine to handle the two click events with the email sending determined by which link button was clicked.
For a quick solution I chose option 1 – clone the subroutine.
However, with time available later I was interested in implementing option 3 – one subroutine handling two click events with a part of the code in the subroutine determined by which link button triggered the event.
In the code below the two link buttons are declared, followed by an outline subroutine to handle the clicking of the two buttons.
'Declare two link buttons with event handling Dim WithEvents cmdSave as System.LinkButton Dim WithEvents cmdAdd as System.LinkButton'Sub routine to handle the clicking of either button. 'Run common block of code in sub routine 'Determine event was triggered and run an optional block Private Sub cmdLButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSave.Click , cmdAdd.click 'common block of code here (update database) 'Code here specific to one item If sender = cmdAdd Then 'send email to applicant confirming form submission End If If sender = cmdSave Then 'send email to applicant confirming form submission End If End Sub
A test is made to determine which of the two link buttons was clicked.
In the example above I have shown each as their own separate if statement. When I developed this further I replaced the if statements with a select.
Shown below is a part of the updated
missing the right buttons/commands, would be better to base this upon the GridView edit/update/delete automation
<asp:GridView ID="gdvCU" runat="server" AllowPaging="false" AllowSorting="false" AutoGenerateColumns="false" > <Columns> <asp:TemplateField ItemStyle-HorizontalAlign="left" ItemStyle-Width="80%"> <ItemTemplate> <asp:RadioButton ID="rbnOption" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Text") %>' GroupName='<%# DataBinder.Eval(Container, "DataItem.Value") %>' Checked='<%# DataBinder.Eval(Container, "DataItem.Selected") %>' AutoPostBack="true" OnCheckedChanged="DeselectSelected" /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField ItemStyle-HorizontalAlign="Left" ItemStyle-Width="20%"> <ItemTemplate> <asp:LinkButton ID="cmdCU" runat="server" Text="Send" CommandName='<%# DataBinder.Eval(Container, "DataItem.Value") %>' CommandArgument='<%# DataBinder.Eval(Container, "DataItem.Value") %>' CausesValidation="false" Visible='<%# DataBinder.Eval(Container, "DataItem.enabled") %>'></asp:LinkButton> <asp:Label ID="FruitId" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.FruitId") %>' Visible="false"></asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
The Associated subroutine to handle the above gridview and its submission.
Protected Sub cmdCURegister(ByVal sender As Object, ByVal e As GridViewCommandEventArgs) Handles gdvCU.RowCommand Try Select Case e.CommandName Case "Registered" 'action here if visitor is registered Case "NotRegistered" 'action here if visitor is not registered End Select End If Catch exc As Exception 'Module failed to load ProcessModuleLoadException(Me, exc) End Try End Sub
What about option 2?
Having satisfied my interest with the common subroutine with a test to determine the source and choose the appropriate action I never implemented option 2.