I've decided to post the source of what I have now. I don't think that
my previous description was clear after reading it again.
Imports System.Text
Imports System.ComponentModel
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports IWebServices
<ToolboxData("<{0}:FLSDataGrid runat=server></{0}:FLSDataGrid>")> _
Public Class FLSDataGrid
Inherits System.Web.UI.WebControls.DataGrid
#Region "Public Methods"
#Region "Constructors"
Public Sub New()
MyBase.New()
Me.EnableViewState = True
m_addrow = New DataGridItem(-1, -1, ListItemType.SelectedItem)
Me.ViewState.Add("m_SortCriteria", "")
Me.ViewState.Add("m_SortDirection", "ASC")
Me.ViewState.Add("m_SearchEnabled", False)
End Sub
#End Region
#End Region
#Region "Public Properties"
Public Property WebDataSource() As IDataWebService
Get
Return m_WebDataSource
End Get
Set(ByVal Value As IDataWebService)
m_WebDataSource = Value
MyBase.VirtualItemCount =
m_WebDataSource.RetrieveRowCount()
Me.PageEvent(Me, New DataGridPageChangedEventArgs(Me,
Me.CurrentPageIndex))
End Set
End Property
Private Property TextFieldsNeeded()
Get
If Not Me.ViewState.Item("m_TextFields") = Nothing Then
Return Me.ViewState.Item("m_TextFields")
Else
Return 0
End If
End Get
Set(ByVal Value)
Me.ViewState.Item("m_TextFields") = Value
End Set
End Property
Public Property SearchEnabled() As Boolean
Get
Return Me.ViewState.Item("m_SearchEnabled")
End Get
Set(ByVal Value As Boolean)
Me.ViewState.Item("m_SearchEnabled") = Value
End Set
End Property
Public Property SortCriteria() As String
Get
Return Me.ViewState.Item("m_SortCriteria")
End Get
Set(ByVal Value As String)
Me.ViewState.Item("m_SortCriteria") = Value
End Set
End Property
Public Property SortDirection() As String
Get
Return Me.ViewState.Item("m_SortDirection")
End Get
Set(ByVal Value As String)
Me.ViewState.Item("m_SortDirection") = Value
End Set
End Property
#End Region
#Region "Protected Methods"
Protected Overrides Sub Render(ByVal output As
System.Web.UI.HtmlTextWriter)
MyBase.Render(output)
End Sub
Protected Friend Overloads Sub OnPreRender(ByVal e As EventArgs)
For Each c As Label In MyBase.Controls
c.EnableViewState = False
Next
Me.CreateAndRegisterScripts()
Me.CreateFooter()
End Sub
Protected Sub Sort(ByVal sender As Object, ByVal e As
DataGridSortCommandEventArgs) Handles MyBase.SortCommand
If SortCriteria = e.SortExpression Then
If SortDirection = "ASC" Then
SortDirection = "DESC"
Else
SortDirection = "ASC"
End If
Else
SortCriteria = e.SortExpression
SortDirection = "DESC"
End If
Me.PageEvent(Me, New DataGridPageChangedEventArgs(Me,
Me.CurrentPageIndex))
End Sub
Protected Overloads Overrides Sub LoadViewState(ByVal savedState As
Object)
MyBase.LoadViewState(savedState)
For Each str As String In Me.ViewState.Keys
If str.StartsWith("txtAddRow") Then
Page.Response.Write(Me.ViewState.Item(str))
End If
Next
Me.CreateFooter()
End Sub
Protected Sub PageEvent(ByVal sender As Object, ByVal e As
DataGridPageChangedEventArgs) Handles MyBase.PageIndexChanged
MyBase.CurrentPageIndex = e.NewPageIndex
If SearchEnabled = True Then
Dim param As DataSet = New DataSet("Search Parameters")
param.Tables.Add("Parameters")
param.Tables("Parameters").Rows.Add(param.Tables("Parameters").NewRow())
Dim editcolumn As Boolean = True
Dim ii As Integer = 0
For Each tc As TableCell In m_addrow.Cells
If editcolumn Then
editcolumn = False
Else
param.Tables("Parameters").Columns.Add("@" +
DirectCast(MyBase.DataSource,
DataSet).Tables(0).Columns(ii).ToString())
param.Tables("Parameters").Rows(0).Item(ii) =
Me.ViewState.Item(DirectCast(tc.Controls(0), TextBox).ID).ToString()
ii += 1
End If
Next
MyBase.DataSource = WebDataSource.RetrieveRecord(param)
Else
MyBase.DataSource =
WebDataSource.RetrieveRowsSubset(e.NewPageIndex, MyBase.PageSize,
Me.SortCriteria, Me.SortDirection)
End If
MyBase.DataBind()
Me.CreateFooter()
End Sub
Protected Sub EditEvent(ByVal sender As Object, ByVal e As
DataGridCommandEventArgs) Handles MyBase.EditCommand
Me.EditItemIndex = e.Item.ItemIndex
Me.PageEvent(Me, New DataGridPageChangedEventArgs(Me,
Me.CurrentPageIndex))
End Sub
Protected Sub CancelEvent(ByVal sender As Object, ByVal e As
DataGridCommandEventArgs) Handles MyBase.CancelCommand
Me.EditItemIndex = -1
Me.PageEvent(Me, New DataGridPageChangedEventArgs(Me,
Me.CurrentPageIndex))
End Sub
Protected Sub UpdateEvent(ByVal sender As Object, ByVal e As
DataGridCommandEventArgs) Handles MyBase.UpdateCommand
Me.PageEvent(Me, New DataGridPageChangedEventArgs(Me,
Me.CurrentPageIndex))
Dim param As DataSet = New DataSet("Update Parameters")
param.Tables.Add("Parameters")
param.Tables("Parameters").Rows.Add(param.Tables("Parameters").NewRow())
Dim editcolumn As Boolean = True
Dim deletecolumn As Boolean = True
Dim i As Integer = 0
For Each tc As TableCell In e.Item.Cells
If editcolumn Then
editcolumn = False
ElseIf deletecolumn Then
deletecolumn = False
Else
Dim tb As TextBox = tc.Controls(0)
param.Tables("Parameters").Columns.Add("@" +
DirectCast(MyBase.DataSource, DataSet).Tables(0).Columns(i).ToString())
param.Tables("Parameters").Rows(0).Item(i) = tb.Text
i += 1
End If
Next
Me.WebDataSource.UpdateRecord(param)
Me.EditItemIndex = -1
Me.PageEvent(Me, New DataGridPageChangedEventArgs(Me,
Me.CurrentPageIndex))
End Sub
Protected Sub DeleteEvent(ByVal sender As Object, ByVal e As
DataGridCommandEventArgs) Handles MyBase.DeleteCommand
Me.PageEvent(Me, New DataGridPageChangedEventArgs(Me,
Me.CurrentPageIndex))
Dim param As DataSet = New DataSet("Update Parameters")
param.Tables.Add("Parameters")
param.Tables("Parameters").Rows.Add(param.Tables("Parameters").NewRow())
Dim editcolumn As Boolean = True
Dim deletecolumn As Boolean = True
Dim i As Integer = 0
For Each tc As TableCell In e.Item.Cells
If editcolumn Then
editcolumn = False
ElseIf deletecolumn Then
deletecolumn = False
Else
param.Tables("Parameters").Columns.Add("@" +
DirectCast(MyBase.DataSource, DataSet).Tables(0).Columns(i).ToString())
param.Tables("Parameters").Rows(0).Item(i) = tc.Text
i += 1
End If
Next
Me.WebDataSource.DeleteRecord(param)
Me.EditItemIndex = -1
Me.PageEvent(Me, New DataGridPageChangedEventArgs(Me,
Me.CurrentPageIndex))
End Sub
Protected Sub AddRecordEvent(ByVal sender As Object, ByVal e As
EventArgs)
Me.PageEvent(Me, New DataGridPageChangedEventArgs(Me,
Me.CurrentPageIndex))
Dim param As DataSet = New DataSet("Update Parameters")
param.Tables.Add("Parameters")
param.Tables("Parameters").Rows.Add(param.Tables("Parameters").NewRow())
Dim editcolumn As Boolean = True
Dim i As Integer = 0
For Each tc As TableCell In m_addrow.Cells
If editcolumn Then
editcolumn = False
Else
param.Tables("Parameters").Columns.Add("@" +
DirectCast(MyBase.DataSource, DataSet).Tables(0).Columns(i).ToString())
param.Tables("Parameters").Rows(0).Item(i) =
Me.ViewState.Item(DirectCast(tc.Controls(0), TextBox).ID).ToString()
i += 1
End If
Next
Me.WebDataSource.InsertRecord(param)
Me.PageEvent(Me, New DataGridPageChangedEventArgs(Me,
Me.CurrentPageIndex))
End Sub
#End Region
#Region "Private Methods"
Private Sub FLSDataGrid_Init(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Init
Me.SetDefaultAttributes()
Me.CreateDynamicControls()
Me.CreateAndRegisterScripts()
End Sub
Private Sub SetDefaultAttributes()
MyBase.AllowPaging = True
MyBase.AllowCustomPaging = True
MyBase.AllowSorting = True
End Sub
Private Sub CreateDynamicControls()
Dim ecc As EditCommandColumn = New EditCommandColumn
ecc.EditText = "Edit"
ecc.CancelText = "Cancel"
ecc.UpdateText = "Save"
MyBase.Columns.Add(ecc)
Dim bc As ButtonColumn = New ButtonColumn
bc.ButtonType = ButtonColumnType.LinkButton
bc.Text = "Delete"
bc.CommandName = "Delete"
MyBase.Columns.Add(bc)
m_AddBtn = New LinkButton
m_AddBtn.EnableViewState = True
m_AddBtn.ID = "m_AddBtn"
m_AddBtn.Text = "Add "
m_AddBtn.Visible = True
m_AddBtn.Attributes.Add("onClick", "ConfirmSave()")
AddHandler m_AddBtn.Click, AddressOf Me.AddRecordEvent
m_PlaceHolderAdd = New PlaceHolder
m_PlaceHolderAdd.EnableViewState = False
m_PlaceHolderAdd.Controls.Add(m_AddBtn)
m_SearchBtn = New LinkButton
m_SearchBtn.EnableViewState = False
m_SearchBtn.ID = "m_SearchBtn"
m_SearchBtn.Text = " Search"
m_SearchBtn.Visible = True
AddHandler m_SearchBtn.Click, AddressOf Me.SearchRecordEvent
m_PlaceHolderSearch = New PlaceHolder
m_PlaceHolderSearch.EnableViewState = True
m_PlaceHolderSearch.Controls.Add(m_SearchBtn)
End Sub
Private Sub CreateAndRegisterScripts()
Dim ConfirmSaveFunction As String = "<SCRIPT
language='JavaScript'>function ConfirmSave() { if (confirm('Proceed
with saving new record?')) return true; if (document.all &&
window.event) event.returnValue = false; return false; }</SCRIPT>"
Dim ConfirmDeleteFunction As String = "<SCRIPT
language='JavaScript'>function ConfirmDelete() { if (confirm('Proceed
with deleting record?')) return true; if (document.all && window.event)
event.returnValue = false; return false; }</SCRIPT>"
Page.RegisterClientScriptBlock("ConfirmSave",
ConfirmSaveFunction)
Page.RegisterClientScriptBlock("ConfirmDelete",
ConfirmDeleteFunction)
Dim DeleteConfirm As String = " <SCRIPT language='JavaScript'>
" + _
" for(i=0;i<document.links.length;i++) " + _
" { " + _
" var x = document.links; " + _
" if(x.innerText==" + ControlChars.Quote + "Delete" +
ControlChars.Quote + ") " + _
" x.onclick = ConfirmDelete; " + _
" continue; " + _
" } " + _
" </SCRIPT> "
Page.RegisterStartupScript("DeleteConfirm", DeleteConfirm)
End Sub
Private Sub CreateFooter()
Dim row As DataGridItem = New DataGridItem(-1, -1,
ListItemType.SelectedItem)
Dim arr As New ArrayList
Dim firstControl As Boolean = True
Dim i As Integer = 0
For Each a As TableCell In MyBase.Items.Item(0).Cells
If a.Controls.Count > 0 Then
If firstControl Then
Dim b As TableCell = New TableCell
b.Controls.Add(m_PlaceHolderAdd)
b.Controls.Add(m_PlaceHolderSearch)
firstControl = False
arr.Add(b)
End If
arr(0).ColumnSpan += 1
Else
Dim b As TableCell = New TableCell
Dim c As TextBox = New TextBox
c.ID = "txtAddRow" + i.ToString()
If Not Page.IsPostBack Then
Me.ViewState.Add(c.ID, "")
End If
c.Text = Me.ViewState.Item(c.ID)
' c.Text = Page.Request.Form.Item(c.ID)
AddHandler c.TextChanged, AddressOf Me.TXT_Unload
b.controls.Add(c)
arr.Add(b)
i += 1
End If
Next
For Each a As TableCell In arr
row.Cells.Add(a)
Next
MyBase.Controls(0).Controls.AddAt(MyBase.Controls(0).Controls.Count -
2, row)
m_addrow = row
For Each dgi As DataGridItem In Me.Items
For Each tc As System.Web.UI.WebControls.TableCell In
dgi.Cells
If Not tc.HasControls() Then
tc.EnableViewState = False
End If
Next
Next
End Sub
Private Sub TXT_Unload(ByVal sender As Object, ByVal e As
System.EventArgs)
Me.ViewState.Item(sender.id) = DirectCast(sender, TextBox).Text
End Sub
Private Sub SearchRecordEvent(ByVal sender As Object, ByVal e As
System.EventArgs)
Me.SearchEnabled = True
Me.PageEvent(Me, New DataGridPageChangedEventArgs(Me,
Me.CurrentPageIndex))
End Sub
#End Region
#Region "Private Members"
Private m_WebDataSource As IDataWebService
Private m_AddBtn As LinkButton
Private m_SearchBtn As LinkButton
Private m_PlaceHolderAdd As PlaceHolder
Private m_PlaceHolderSearch As PlaceHolder
Private m_addrow As DataGridItem
#End Region
End Class