Table of Contents [Hide/Show]
Features Consuming the Class in Your ASPX Page ASPX Markup Code Declare a Private Variable C# Visual Basic Write Callback Function to Retrieve Data C# Visual Basic Write Callback Function to Save Changes to a Row C# Visual Basic Write Callback Function to Delete a Row C# Visual Basic Instantiate the Class C# Visual Basic Querying Data Source Code Sample Code-Behind C# Visual Basic GridViewExtender Class C# Visual Basic
GridViewExtender
confirm
<asp:TemplateField>
ImageUrl
LinkButton
Button
ImageButton
<asp:GridView runat="server" ID="uxGridView" AutoGenerateColumns="false" CellPadding="3" CellSpacing="0" DataKeyNames="ID"> <EmptyDataTemplate> No records match your search criteria. </EmptyDataTemplate> <Columns> <%-- TODO: Add columns to this GridView --%> <asp:TemplateField> <HeaderTemplate>Action</HeaderTemplate> <ItemTemplate> <asp:ImageButton runat="server" ID="uxEditButton" CommandName="Edit" ImageUrl="~/images/Pencil.png" ToolTip="Edit" /> <asp:ImageButton runat="server" ID="uxDeleteButton" CommandName="Delete" ImageUrl="~/images/Delete.png" ToolTip="Delete" /> <%-- TODO: Specify ValidationGroup for the Save button --%> <asp:ImageButton runat="server" ID="uxSaveButton" CommandName="Update" ImageUrl="~/images/Save.png" ToolTip="Save Changes" /> <asp:ImageButton runat="server" ID="uxCancelButton" CommandName="Cancel" ImageUrl="~/images/StopSign.png" ToolTip="Discard Changes" /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> <asp:Button runat="server" ID="uxAddNewButton" Text="Add New" />
private GridViewExtender _gridViewExt;
Private _gridViewExt as GridViewExtender
private DataTable QueryData() { int id = Session["ID"]; DataTable t = db.GetRecords(id); return t; }
Private Function QueryData() As DataTable Dim id as Integer = Session("ID") Dim t as DataTable = db.GetRecords(id) Return t End Function
private void UpdateData(DataKey rowKey, GridViewRow gvRow) { if (Page.IsValid) { int id = int.Parse(rowKey["ID"].ToString()); string description = (gvRow.FindControl("uxDescriptionTextBox") as TextBox).Text; db.SaveData(id, description); } }
Private Sub UpdateData(ByVal rowKey as DataKey, ByVal gvRow as GridViewRow) If Page.IsValid Then Dim id as Integer = Convert.ToInt32(rowKey("ID")) Dim description As String = CType(gvRow.FindControl("uxDescriptionTextBox"), TextBox).Text db.SaveData(id, description) End If End Sub
private void DeleteData(DataKey rowKey) { int id = int.Parse(rowKey["ID"].ToString()); db.DeleteData(id); }
Private Sub DeleteData(ByVal rowKey as DataKey) Dim id as Integer = Convert.ToInt32(rowKey("ID")) db.DeleteData(id) End Sub
If Not Page.IsPostBack
_gridViewExt = new GridViewExtender(uxGridView, "Description", New EmptyDelegate(AddressOf QueryData), New DataKeyDelegate(AddressOf DeleteData), New GridViewRowDelegate(AddressOf UpdateData));
_gridViewExt = new GridViewExtender(uxGridView, "Description", _ New EmptyDelegate(AddressOf QueryData), _ New DataKeyDelegate(AddressOf DeleteData), _ New GridViewRowDelegate(AddressOf UpdateData))
_gridViewExt.Requery()
private GridViewExtender _gridViewExt; protected void Page_Load(object sender, EventArgs e) { _gridViewExt = New GridViewExtender(uxGridView, "Description", New EmptyDelegate(AddressOf QueryData), New DataKeyDelegate(AddressOf DeleteData), New GridViewRowDelegate(AddressOf UpdateData)); if (!Page.IsPostBack) _gridViewExt.Requery(); } private DataTable QueryData() { //TODO: Code the QueryData procedure //int id = Session["ID"]; //DataTable t = db.GetRecords(id); //return t; } private void UpdateData(DataKey rowKey, GridViewRow gvRow) { //TODO: Code the UpdateData procedure if (Page.IsValid) { //int id = int.Parse(rowKey["ID"]); //string description = (gvRow.FindControl("uxDescriptionTextBox") As TextBox).Text; //db.SaveData(id, description); } } private void DeleteData(DataKey rowKey) { //TODO: Code the DeleteData procedure //int id = int.Parse(rowKey["ID"]); //db.DeleteData(id); } private void uxAddNewButton_Click(object sender, EventArgs e) { _gridViewExt.AddNew(); }
Private _gridViewExt As GridViewExtender Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load _gridViewExt = New GridViewExtender(uxGridView, "Description", _ New EmptyDelegate(AddressOf QueryData), _ New DataKeyDelegate(AddressOf DeleteData), _ New GridViewRowDelegate(AddressOf UpdateData)) If Not Page.IsPostBack Then _gridViewExt.Requery() End If End Sub Private Function QueryData() As DataTable 'TODO: Code the QueryData procedure 'Dim id as Integer = Session("ID") 'Dim t as DataTable = db.GetRecords(id) 'Return t End Function Private Sub UpdateData(ByVal rowKey as DataKey, ByVal gvRow as GridViewRow) 'TODO: Code the UpdateData procedure If Page.IsValid Then 'Dim id as Integer = Convert.ToInt32(rowKey("ID")) 'Dim description As String = CType(gvRow.FindControl("uxDescriptionTextBox"), TextBox).Text 'db.SaveData(id, description) End If End Sub Private Sub DeleteData(ByVal rowKey as DataKey) 'TODO: Code the DeleteData procedure 'Dim id as Integer = Convert.ToInt32(rowKey("ID")) 'db.DeleteData(id) End Sub Private Sub uxAddNewButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles uxAddNewButton.Click _gridViewExt.AddNew() End Sub
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data; public delegate DataTable EmptyDelegate(); public delegate void DataKeyDelegate(DataKey rowKey); public delegate void GridViewRowDelegate(DataKey rowKey, GridViewRow gvRow); public class GridViewExtender { private GridView _gridView; private string _identifyingField; private EmptyDelegate _requeryHandler; private DataKeyDelegate _deleteHandler; private GridViewRowDelegate _updateHandler; //- Constructor ------------------------------------------------------------------------------- public GridViewExtender(GridView gridView, string identifyingField, EmptyDelegate requeryHandler, DataKeyDelegate deleteHandler, GridViewRowDelegate updateHandler) { _gridView = gridView; _identifyingField = identifyingField; _requeryHandler = requeryHandler; _deleteHandler = deleteHandler; _updateHandler = updateHandler; _gridView.RowDataBound += new GridViewRowEventHandler(_gridView_RowDataBound); _gridView.RowEditing += new GridViewEditEventHandler(_gridView_RowEditing); _gridView.RowCancelingEdit += new GridViewCancelEditEventHandler(_gridView_RowCancelingEdit); _gridView.RowDeleting += new GridViewDeleteEventHandler(_gridView_RowDeleting); _gridView.RowUpdating += new GridViewUpdateEventHandler(_gridView_RowUpdating); } //- Public Methods ---------------------------------------------------------------------------- public void AddNew() { BindToDataTable(-1, true); } //--------------------------------------------------------------------------------------------- public void Requery() { this.EditIndex = this.EditIndex; } //--------------------------------------------------------------------------------------------- public bool TryGetDataRow(GridViewRow row, DataRow dataRow) { bool result = false; DataRowView drv = row.DataItem as DataRowView; if (drv != null) { dataRow = drv.Row; result = (dataRow != null); } return result; } //- Private Methods --------------------------------------------------------------------------- private void BindToDataTable(int editIndex) { BindToDataTable(editIndex, false); } //--------------------------------------------------------------------------------------------- private void BindToDataTable(int editIndex, bool addNew) { _gridView.EditIndex = editIndex; if (_requeryHandler != null) { DataTable t = _requeryHandler(); if (addNew) { foreach (DataColumn col in t.Columns) col.AllowDBNull = true; DataRow newRow = t.NewRow(); t.Rows.Add(newRow); } _gridView.DataSource = t; if (addNew) _gridView.EditIndex = t.Rows.Count - 1; _gridView.DataBind(); foreach (GridViewRow row in _gridView.Rows) { if (row.RowType != DataControlRowType.DataRow) { SetVisibility(row, "uxDeleteButton", false); SetVisibility(row, "uxEditButton", false); SetVisibility(row, "uxSaveButton", false); SetVisibility(row, "uxCancelButton", false); } else { bool editMode = (row.RowIndex == _gridView.EditIndex); SetVisibility(row, "uxDeleteButton", !editMode); SetVisibility(row, "uxEditButton", !editMode); SetVisibility(row, "uxSaveButton", editMode); SetVisibility(row, "uxCancelButton", editMode); } } } } //--------------------------------------------------------------------------------------------- private int EditIndex { get { return _gridView.EditIndex; } set { BindToDataTable(value); } } //- Event Handlers ---------------------------------------------------------------------------- private void _gridView_RowDataBound(object sender, GridViewRowEventArgs e) { try { if (e.Row != null && e.Row.RowType == DataControlRowType.DataRow && e.Row.DataItem != null) { DataRow dataRow = (e.Row.DataItem as DataRowView).Row; if (dataRow != null && dataRow[_identifyingField] != null) { string identifier = dataRow[_identifyingField].ToString(); WebControl control = e.Row.FindControl("uxDeleteButton") as WebControl; ImageButton button = null; if (control != null) { button = control as ImageButton; button.OnClientClick = "confirm('Delete [" + identifier.Replace("'", "\\'") + "]?')'"; } } } } catch (Exception ex) { throw ex; } } //--------------------------------------------------------------------------------------------- private void _gridView_RowEditing(object sender, GridViewEditEventArgs e) { BindToDataTable(e.NewEditIndex); } //--------------------------------------------------------------------------------------------- private void _gridView_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { BindToDataTable(-1); } //--------------------------------------------------------------------------------------------- private void _gridView_RowDeleting(object sender, GridViewDeleteEventArgs e) { if (_deleteHandler != null & _requeryHandler != null) { try { _deleteHandler(_gridView.DataKeys[e.RowIndex]); BindToDataTable(-1); } catch //(Exception ex) { e.Cancel = true; } } } //--------------------------------------------------------------------------------------------- private void _gridView_RowUpdating(object sender, GridViewUpdateEventArgs e) { if (_updateHandler != null & _requeryHandler != null) { try { _updateHandler(_gridView.DataKeys[e.RowIndex], _gridView.Rows[e.RowIndex]); BindToDataTable(-1); } catch { e.Cancel = true; } } } //- Helper Functions -------------------------------------------------------------------------- private static void SetVisibility(GridViewRow row, string controlName, bool visible) { WebControl control = row.FindControl(controlName) as WebControl; if (control != null) control.Visible = visible; } }
Imports Microsoft.VisualBasic Imports System.Data Public Delegate Function EmptyDelegate() As DataTable Public Delegate Sub DataKeyDelegate(ByVal rowKey As DataKey) Public Delegate Sub GridViewRowDelegate(ByVal rowKey As DataKey, ByVal gvRow As GridViewRow) Public Class GridViewExtender Private WithEvents _gridView As GridView Private _identifyingField As String Private _requeryHandler As EmptyDelegate Private _deleteHandler As DataKeyDelegate Private _updateHandler As GridViewRowDelegate '-- Constructor ------------------------------------------------------------------------------- Public Sub New(ByVal gridView As GridView, ByVal identifyingField As String, ByVal _ requeryHandler As EmptyDelegate, ByVal deleteHandler As DataKeyDelegate, ByVal updateHandler As _ GridViewRowDelegate) _gridView = gridView _identifyingField = identifyingField _requeryHandler = requeryHandler _deleteHandler = deleteHandler _updateHandler = updateHandler End Sub '-- Public Methods ---------------------------------------------------------------------------- Public Sub AddNew() BindToDataTable(-1, True) End Sub '---------------------------------------------------------------------------------------------- ''' <summary> ''' Gets or sets the EditIndex of the grid. After setting the EditIndex, requeries the grid. ''' </summary> ''' <value>Specify -1 to have no row in edit mode.</value> Public Property EditIndex() As Integer Get Return _gridView.EditIndex End Get Set(ByVal value As Integer) BindToDataTable(value) End Set End Property '---------------------------------------------------------------------------------------------- Public Sub Requery() Me.EditIndex = Me.EditIndex End Sub '-- Private Methods --------------------------------------------------------------------------- Private Sub BindToDataTable(ByVal editIndex As Integer, Optional ByVal addNew As Boolean = False) _gridView.EditIndex = editIndex If _requeryHandler IsNot Nothing Then Dim t As DataTable = _requeryHandler() If addNew Then For Each col As DataColumn In t.Columns col.AllowDBNull = True Next Dim newRow As DataRow = t.NewRow() t.Rows.Add(newRow) End If _gridView.DataSource = t If addNew Then _gridView.EditIndex = t.Rows.Count - 1 End If _gridView.DataBind() For Each row As GridViewRow In _gridView.Rows Dim editMode As Boolean = (row.RowIndex = _gridView.EditIndex) SetVisibility(row, "uxDeleteButton", Not editMode) SetVisibility(row, "uxEditButton", Not editMode) SetVisibility(row, "uxSaveButton", editMode) SetVisibility(row, "uxCancelButton", editMode) Next End If End Sub '-- Event Handlers ---------------------------------------------------------------------------- Private Sub _gridView_RowDataBound(ByVal sender As Object, ByVal e As _ GridViewRowEventArgs) Handles _gridView.RowDataBound Try If e.Row IsNot Nothing AndAlso e.Row.RowType = DataControlRowType.DataRow AndAlso _ e.Row.DataItem IsNot Nothing Then Dim dataRow As DataRow = CType(e.Row.DataItem, DataRowView).Row If dataRow IsNot Nothing Then '-- Init Delete Button -------------------------------------------------------- If dataRow(_identifyingField) IsNot Nothing Then Dim identifier As String = dataRow(_identifyingField).ToString() Dim control As WebControl = _ CType(e.Row.FindControl("uxDeleteButton"), WebControl) Dim button As ImageButton = Nothing If control IsNot Nothing Then button = CType(control, ImageButton) button.OnClientClick = "confirm('Delete [" & _ identifier.Replace("'", "\'") & "]?');" End If End If End If End If Catch ex As Exception Throw ex End Try End Sub '---------------------------------------------------------------------------------------------- Private Sub _gridView_RowEdit(ByVal sender As Object, ByVal e As GridViewEditEventArgs) _ Handles _gridView.RowEditing BindToDataTable(e.NewEditIndex) End Sub '---------------------------------------------------------------------------------------------- Private Sub _gridView_RowCancellingEdit(ByVal sender As Object, ByVal e As _ GridViewCancelEditEventArgs) Handles _gridView.RowCancelingEdit BindToDataTable(-1) End Sub '---------------------------------------------------------------------------------------------- Private Sub _gridView_RowDeleting(ByVal sender As Object, ByVal e As GridViewDeleteEventArgs) _ Handles _gridView.RowDeleting If _deleteHandler IsNot Nothing And _requeryHandler IsNot Nothing Then Try _deleteHandler(_gridView.DataKeys(e.RowIndex)) BindToDataTable(-1) Catch ex As Exception e.Cancel = True End Try End If End Sub '---------------------------------------------------------------------------------------------- Private Sub _gridView_RowUpdating(ByVal sender As Object, ByVal e As GridViewUpdateEventArgs) _ Handles _gridView.RowUpdating If _updateHandler IsNot Nothing And _requeryHandler IsNot Nothing Then Try _updateHandler(_gridView.DataKeys(e.RowIndex), _gridView.Rows(e.RowIndex)) BindToDataTable(-1) Catch ex As Exception e.Cancel = True End Try End If End Sub '---------------------------------------------------------------------------------------------- Public Function TryGetDataRow(ByVal row As GridViewRow, ByRef dataRow As DataRow) As Boolean Dim result As Boolean = False Dim drv As DataRowView = CType(row.DataItem, DataRowView) If drv IsNot Nothing Then dataRow = drv.Row result = (dataRow IsNot Nothing) End If Return result End Function '-- Helper Functions -------------------------------------------------------------------------- Private Shared Sub SetVisibility(ByVal row As GridViewRow, ByVal controlName As String, ByVal _ visible As Boolean) Dim control As WebControl = CType(row.FindControl(controlName), WebControl) If control IsNot Nothing Then control.Visible = visible End If End Sub End Class
ScrewTurn Wiki version 3.0.1.400. Some of the icons created by FamFamFam. Except where noted, all contents Copyright © 1999-2024, Patrick Jasinski.