
SqlDataSourceCommandEventHandler Delegate
Assembly: System.Web (in system.web.dll)
'Declaration Public Delegate Sub SqlDataSourceCommandEventHandler ( _ sender As Object, _ e As SqlDataSourceCommandEventArgs _ )
'Usage Dim instance As New SqlDataSourceCommandEventHandler(AddressOf HandlerMethod)
/** @delegate */ public delegate void SqlDataSourceCommandEventHandler ( Object sender, SqlDataSourceCommandEventArgs e )
Parameters
- sender
-
The source of the event, the SqlDataSource control.
- e
-
A SqlDataSourceCommandEventArgs that contains the event data.
When you create a SqlDataSourceCommandEventHandler delegate, you identify the method that will handle the event. To associate the event with your event handler, add an instance of the delegate to the event. The event handler is called whenever the event occurs, unless you remove the delegate. For more information about event handler delegates, see Consuming Events.
The following code example demonstrates how to handle the Inserting event to perform any preprocessing steps, such as adding a parameter to the DbCommand object contained by the SqlDataSourceCommandEventArgs to capture the value of an output parameter, before a database action is performed. In this example an insert is performed by a DetailsView control in a classic master-detail scenario, using a stored procedure. The value of the output parameter, which represents the primary key of the newly inserted row, is examined when the Inserted event is raised after the operation completes.
<%@Page Language="VB" %> <%@Import Namespace="System.Data" %> <%@Import Namespace="System.Data.Common" %> <%@Import Namespace="System.Data.SqlClient" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> Sub On_Inserting(ByVal sender As Object, ByVal e As SqlDataSourceCommandEventArgs) Dim insertedKey As SqlParameter insertedKey = New SqlParameter("@PK_New", SqlDbType.Int) insertedKey.Direction = ParameterDirection.Output e.Command.Parameters.Add(insertedKey) End Sub 'On_Inserting Sub On_Inserted(ByVal sender As Object, ByVal e As SqlDataSourceStatusEventArgs) Dim command As DbCommand command = e.Command ' The label displays the primary key of the recently inserted row. Label1.Text = command.Parameters("@PK_New").Value.ToString() ' Explicitly call DataBind to refresh the data ' and show the newly inserted row. GridView1.DataBind() End Sub 'On_Inserted </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>ASP.NET Example</title> </head> <body> <form id="form1" runat="server"> <asp:GridView id="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="EmployeeID" DataSourceID="SqlDataSource1"> <columns> <asp:BoundField HeaderText="First Name" DataField="FirstName" /> <asp:BoundField HeaderText="Last Name" DataField="LastName" /> <asp:BoundField HeaderText="Title" DataField="Title" /> <asp:ButtonField ButtonType="Link" CommandName="Select" Text="Details..." /> </columns> </asp:GridView> <asp:SqlDataSource id="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyNorthwind %>" SelectCommand="SELECT EmployeeID,FirstName,LastName,Title FROM Employees"> </asp:SqlDataSource> <hr /> <asp:DetailsView id="DetailsView1" runat="server" DataSourceID="SqlDataSource2" AutoGenerateRows="False" AutoGenerateInsertButton="True"> <fields> <asp:BoundField HeaderText="First Name" DataField="FirstName" ReadOnly="False"/> <asp:BoundField HeaderText="Last Name" DataField="LastName" ReadOnly="False"/> <asp:TemplateField HeaderText="Title"> <ItemTemplate> <asp:DropDownList id="TitleDropDownList" runat="server" selectedvalue="<%# Bind('Title') %>" > <asp:ListItem Selected="True">Sales Representative</asp:ListItem> <asp:ListItem>Sales Manager</asp:ListItem> <asp:ListItem>Vice President, Sales</asp:ListItem> </asp:DropDownList> </ItemTemplate> </asp:TemplateField> <asp:BoundField HeaderText="Notes" DataField="Notes" ReadOnly="False"/> </fields> </asp:DetailsView> <asp:SqlDataSource id="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:MyNorthwind%>" SelectCommand="SELECT * FROM Employees" InsertCommandType = "StoredProcedure" InsertCommand="sp_insertemployee" OnInserting="On_Inserting" OnInserted ="On_Inserted" FilterExpression="EmployeeID={0}"> <FilterParameters> <asp:ControlParameter Name="EmployeeID" ControlId="GridView1" PropertyName="SelectedValue" /> </FilterParameters> </asp:SqlDataSource> <!-- -- An example sp_insertemployee stored procedure that returns -- the primary key of the row that was inserted in an OUT parameter. CREATE PROCEDURE sp_insertemployee @FirstName nvarchar(10), @LastName nvarchar(20) , @Title nvarchar(30), @Notes nvarchar(200), @PK_New int OUTPUT AS INSERT INTO Employees(FirstName,LastName,Title,Notes)VALUES (@FirstName,@LastName,@Title,@Notes) SELECT @PK_New = @@IDENTITY RETURN (1) GO --> <asp:Label id="Label1" runat="server" /> </form> </body> </html>
<%@Page Language="VJ#" %> <%@Import Namespace="System.Data" %> <%@Import Namespace="System.Data.Common" %> <%@Import Namespace="System.Data.SqlClient" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> private void On_Inserting(Object sender, SqlDataSourceCommandEventArgs e) { // Add the Title parameter from the TemplatedField. // Cast the first Item of the DetailsView to a Table. Table tbl = (Table)DetailsView1.get_Controls().get_Item(0); // Get row two (the third row) from the rows collection. // This is the row that the DropDownList is in. TableRowCollection rows = tbl.get_Rows(); TableRow titleRow = rows.get_Item(2); // Cast the second item in the controls collection of cell one as a // DropDownList. DropDownList title = (DropDownList)titleRow.get_Cells().get_Item(1). get_Controls().get_Item(1); SqlParameter titleParam = new SqlParameter( "@Title", title.get_SelectedValue()); e.get_Command().get_Parameters().Add(titleParam); } //On_Inserting private void On_Inserted(Object sender, SqlDataSourceStatusEventArgs e) { // Explicitly call DataBind to refresh the data // and show the newly inserted row. GridView1.DataBind(); } //On_Inserted </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>ASP.NET Example</title> </head> <body> <form id="form1" runat="server"> <asp:GridView id="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="EmployeeID" SelectedIndex="0" DataSourceID="SqlDataSource1"> <Columns> <asp:BoundField HeaderText="First Name" DataField="FirstName" /> <asp:BoundField HeaderText="Last Name" DataField="LastName" /> <asp:BoundField HeaderText="Title" DataField="Title" /> <asp:ButtonField ButtonType="Link" CommandName="Select" Text="Details..." /> </Columns> </asp:GridView> <asp:SqlDataSource id="SqlDataSource1" runat="server" ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" SelectCommand="SELECT EmployeeID,FirstName,LastName,Title FROM Employees"> </asp:SqlDataSource> <hr /> <asp:DetailsView id="DetailsView1" runat="server" DataSourceID="SqlDataSource2" AutoGenerateRows="False" AutoGenerateInsertButton="True"> <Fields> <asp:BoundField HeaderText="First Name" DataField="FirstName" ReadOnly="False"/> <asp:BoundField HeaderText="Last Name" DataField="LastName" ReadOnly="False"/> <asp:TemplateField HeaderText="Title"> <ItemTemplate> <asp:DropDownList runat="server"> <asp:ListItem Selected="True">Sales Representative</asp:ListItem> <asp:ListItem>Sales Manager</asp:ListItem> <asp:ListItem>Vice President, Sales</asp:ListItem> </asp:DropDownList> </ItemTemplate> </asp:TemplateField> <asp:BoundField HeaderText="Notes" DataField="Notes" ReadOnly="False"/> </Fields> </asp:DetailsView> <asp:SqlDataSource id="SqlDataSource2" runat="server" ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" SelectCommand="SELECT * FROM Employees" InsertCommand="INSERT INTO Employees(FirstName,LastName,Title,Notes)VALUES (@FirstName,@LastName,@Title,@Notes)" OnInserting="On_Inserting" OnInserted="On_Inserted" FilterExpression="EmployeeID=@EmployeeID"> <FilterParameters> <asp:ControlParameter Name="EmployeeID" ControlId="GridView1" PropertyName="SelectedDataKey.Value"/> </FilterParameters> </asp:SqlDataSource> </form> </body> </html>
The following code example demonstrates how to handle the RowUpdating event raised by the GridView control, to possibly cancel a database action performed by a SqlDataSource control associated with the GridView control.
<%@Page Language="VB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> ' Set helper text and cancel the update if the values submitted to update the row ' do not meet requirements. Sub OnRowUpdatingHandler(ByVal source As Object, ByVal e As GridViewUpdateEventArgs) If e.OldValues(0).Equals("Nancy") Then e.Cancel = "True" Label1.Text="This Row is Not Updatable!" End If End Sub 'OnRowUpdatingHandler ' Ensure any helper text is cleared. Sub OnRowCancellingHandler(ByVal source As Object, ByVal e As GridViewCancelEditEventArgs) Label1.Text="" End Sub 'OnRowCancellingHandler </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>ASP.NET Example</title> </head> <body> <form id="form1" runat="server"> <asp:SqlDataSource id="SqlDataSource1" runat="server" DataSourceMode="DataSet" ConnectionString="<%$ ConnectionStrings:MyNorthwind%>" SelectCommand="SELECT EmployeeID,FirstName,LastName,Title FROM Employees" UpdateCommand="Update Employees SET FirstName=@FirstName,LastName=@LastName,Title=@Title WHERE EmployeeID=@EmployeeID"> </asp:SqlDataSource> <asp:GridView id="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="EmployeeID" AutoGenerateEditButton="True" DataSourceID="SqlDataSource1" OnRowUpdating="OnRowUpdatingHandler" OnRowCancelingEdit="OnRowCancellingHandler"> <columns> <asp:BoundField HeaderText="First Name" DataField="FirstName" /> <asp:BoundField HeaderText="Last Name" DataField="LastName" /> <asp:BoundField HeaderText="Title" DataField="Title" /> </columns> </asp:GridView> <asp:Label id="Label1" runat="server"> </asp:Label> </form> </body> </html>
<%@Page Language="VJ#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> // Set helper text and cancel the update if the values submitted to update // the row do not meet requirements. private void OnRowUpdatingHandler(Object source, GridViewUpdateEventArgs e) { // You can examine the values submitted by the user and perform // additional processing as required. if (e.get_OldValues().get_Item(0).Equals("Nancy")) { e.set_Cancel(true); Label1.set_Text("This Row is Not Updatable!"); } } //OnRowUpdatingHandler // Ensure any helper text is cleared. private void OnRowCancellingHandler(Object source, GridViewCancelEditEventArgs e) { Label1.set_Text(""); } //OnRowCancellingHandler </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>ASP.NET Example</title> </head> <body> <form id="form1" runat="server"> <asp:SqlDataSource id="SqlDataSource1" runat="server" DataSourceMode="DataSet" ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" SelectCommand="SELECT EmployeeID,FirstName,LastName,Title FROM Employees" UpdateCommand="Update Employees SET FirstName=@FirstName,LastName=@LastName,Title=@Title WHERE EmployeeID=@EmployeeID"> </asp:SqlDataSource> <asp:GridView id="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="EmployeeID" AutoGenerateEditButton="True" DataSourceID="SqlDataSource1" OnRowUpdating="OnRowUpdatingHandler" OnRowCancelingEdit="OnRowCancellingHandler"> <Columns> <asp:BoundField HeaderText="First Name" DataField="FirstName" /> <asp:BoundField HeaderText="Last Name" DataField="LastName" /> <asp:BoundField HeaderText="Title" DataField="Title" /> </Columns> </asp:GridView> <asp:Label id="Label1" runat="server"> </asp:Label> </form> </body> </html>