📄 superdatagrid.vb
字号:
'
'*********************************************************************
Public Function LoadPostData(postDataKey As String, values As NameValueCollection) As Boolean Implements IPostBackDataHandler.LoadPostData
Dim key As String
For Each key In values.Keys
colEditValues(key) = values(key)
Next key
Return False
End Function 'LoadPostData
'*********************************************************************
'
' RaisePostDataChangedEvent Method
'
' Required by the PostBackDataHandler interface.
'
'*********************************************************************
Public Sub RaisePostDataChangedEvent() Implements IPostBackDataHandler.RaisePostDataChangedEvent
End Sub 'RaisePostDataChangedEvent
'*********************************************************************
'
' RaisePostBackEvent Method
'
' When a link is clicked (for sorting, paging, editing), this
' method launches off the right action.
'
'*********************************************************************
Public Sub RaisePostBackEvent(eventArgument As String) Implements IPostBackEventHandler.RaisePostBackEvent
Dim parts As String() = eventArgument.Split(New [Char]() {"_"c}, 2)
Select Case parts(0)
Case "edit"
_editClicked = True
EditItemIndex = Int32.Parse(parts(1))
Case "cancel"
EditItemIndex = - 1
Case "update"
_updateClicked = True
Case "sort"
UpdateSort(parts(1))
Case "page"
UpdatePage(Int32.Parse(parts(1)))
Case "delete"
_deleteClicked = True
_deleteItemIndex = Int32.Parse(parts(1))
End Select
End Sub 'RaisePostBackEvent
'*********************************************************************
'
' UpdatePage Method
'
' Change the current page when paging is enabled.
'
'*********************************************************************
Private Sub UpdatePage(newPageIndex As Integer)
CurrentPageIndex = newPageIndex
End Sub 'UpdatePage
'*********************************************************************
'
' UpdateDatabase Method
'
' Perform the update to the database table.
'
'*********************************************************************
Private Sub UpdateDatabase()
' Start by updating the data table
Dim row As DataRow = _dataGridView(EditItemIndex).Row
Dim col As DataColumn
For Each col In _dataGridData.Columns
If colEditValues.Contains("txt" & col.ColumnName) Then
Try
row(col.ColumnName) = colEditValues(("txt" & col.ColumnName))
Catch
_errorMessage = "Could not update column " & col.ColumnName
Return
End Try
End If
Next col
' Create a command builder
Dim dad As New SqlDataAdapter(_commandText, ConnectionString)
Dim builder As New SqlCommandBuilder(dad)
Try
dad.Update(_dataGridData)
Catch ex As Exception
_errorMessage = ex.Message
Return
End Try
' Deselect any row for editing
EditItemIndex = - 1
End Sub 'UpdateDatabase
Private Sub DeleteRow(rowIndex As Integer)
' Delete row from datatable
Dim row As DataRow = _dataGridView(rowIndex).Row
row.Delete()
' Create a command builder
Dim dad As New SqlDataAdapter(_commandText, ConnectionString)
Dim builder As New SqlCommandBuilder(dad)
Try
dad.Update(_dataGridData)
Catch ex As Exception
_errorMessage = ex.Message
End Try
End Sub 'DeleteRow
'*********************************************************************
'
' UpdateSort Method
'
' When a new column is clicked for sorting, update the SortColumn
' and SortOrder.
'
'*********************************************************************
Private Sub UpdateSort(sortExpression As String)
EditItemIndex = - 1
CurrentPageIndex = 1
If sortExpression = SortColumn Then
If SortOrder = "DESC" Then
SortOrder = "ASC"
Else
SortOrder = "DESC"
End If
Else
SortOrder = "ASC"
End If
SortColumn = sortExpression
End Sub 'UpdateSort
'*********************************************************************
'
' InitDatabaseObjects Method
'
' Initialize the connection string and the command text.
'
'*********************************************************************
Private Sub InitDatabaseObjects()
' Check connection string
If ConnectionString = String.Empty Then
Throw New ArgumentException("You must set the ConnectionString property!")
End If
' Check table name
If TableName = String.Empty AndAlso CommandText = String.Empty Then
Throw New ArgumentException("You must set the TableName or CommandText property!")
End If
' Calculate SELECT statement
If CommandText = String.Empty Then
_commandText = String.Format("SELECT * FROM {0}", TableName)
Else
_commandText = CommandText
End If
End Sub 'InitDatabaseObjects
'*********************************************************************
'
' LoadDatabaseData Method
'
' Load the database data and schema.
'
'*********************************************************************
Private Sub LoadDatabaseData()
InitDatabaseObjects()
' Get datagrid table
Dim con As New SqlConnection(ConnectionString)
con.Open()
Dim dad As New SqlDataAdapter(_commandText, con)
dad.Fill(_dataGridData)
' Get datagrid schema
Dim cmd As New SqlCommand(_commandText, con)
_dataGridSchema = cmd.ExecuteReader(CommandBehavior.SchemaOnly).GetSchemaTable()
con.Close()
End Sub 'LoadDatabaseData
'*********************************************************************
'
' RenderTable Method
'
' Display the main HTML table to display the database data.
'
'*********************************************************************
Private Sub RenderTable(writer As HtmlTextWriter)
' Calculate Alternating Item Style
_alternatingItemStyle.MergeWith(_itemStyle)
' Calculate Start Index
Dim startIndex As Integer = 0
If _enablePaging Then
startIndex =(CurrentPageIndex - 1) * _pageSize
End If
' Calculate End Index
Dim endIndex As Integer = _dataGridData.Rows.Count
If _enablePaging Then
endIndex = startIndex + _pageSize
If endIndex > _dataGridData.Rows.Count Then
endIndex = _dataGridData.Rows.Count
End If
End If
' Render rows
Dim i As Integer
For i = startIndex To endIndex - 1
If i Mod 2 = 0 Then
_itemStyle.AddAttributesToRender(writer)
Else
_alternatingItemStyle.AddAttributesToRender(writer)
End If
If _enableEditing AndAlso EditItemIndex = i Then
RenderEditRow(writer, i)
Else
RenderRow(writer, i)
End If
Next i
End Sub 'RenderTable
'*********************************************************************
'
' RenderRow Method
'
' Display a particular row in the HTML table.
'
'*********************************************************************
Private Sub RenderRow(writer As HtmlTextWriter, itemIndex As Integer)
writer.RenderBeginTag(HtmlTextWriterTag.Tr)
If _enableEditing Then
writer.RenderBeginTag(HtmlTextWriterTag.Td)
RenderLink(writer, "Edit", "edit_" & itemIndex.ToString())
If _enableDeleting Then
writer.Write(" | ")
writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "return confirm('Are you sure you want to delete this row?')")
RenderLink(writer, "Delete", "delete_" & itemIndex.ToString())
End If
writer.RenderEndTag()
End If
Dim i As Integer
For i = 0 To _dataGridData.Columns.Count - 1
writer.RenderBeginTag(HtmlTextWriterTag.Td)
RenderColumn(writer, itemIndex, i)
writer.RenderEndTag()
Next i
writer.RenderEndTag()
End Sub 'RenderRow
'*********************************************************************
'
' RenderEditRow Method
'
' Render a row for editing.
'
'*********************************************************************
Private Sub RenderEditRow(writer As HtmlTextWriter, itemIndex As Integer)
writer.RenderBeginTag(HtmlTextWriterTag.Tr)
writer.RenderBeginTag(HtmlTextWriterTag.Td)
' Render update link
RenderLink(writer, "Update", "update_" & itemIndex.ToString())
writer.Write(" | ")
' Render Cancel link
RenderLink(writer, "Cancel", "cancel_" & itemIndex.ToString())
writer.RenderEndTag()
Dim i As Integer
For i = 0 To _dataGridData.Columns.Count - 1
writer.AddAttribute(HtmlTextWriterAttribute.Valign, "top")
writer.RenderBeginTag(HtmlTextWriterTag.Td)
RenderEditColumn(writer, itemIndex, i)
writer.RenderEndTag()
Next i
writer.RenderEndTag()
End Sub 'RenderEditRow
'*********************************************************************
'
' RenderColumn Method
'
' Render the value of a column. For money columns, we'll apply
' some formatting.
'
'*********************************************************************
Private Sub RenderColumn(writer As HtmlTextWriter, rowIndex As Integer, colIndex As Integer)
Dim colValue As Object = _dataGridView(rowIndex)(colIndex)
Dim providerType As SqlDbType = CType(_dataGridSchema.Rows(colIndex)("ProviderType"), SqlDbType)
Select Case providerType
Case SqlDbType.Money
writer.Write(System.Convert.ToDecimal(colValue).ToString("c"))
Case SqlDbType.Image
writer.Write("[Image]")
Case SqlDbType.DateTime
Dim dtm As DateTime = CType(colValue, DateTime)
If dtm.Date = dtm Then
writer.Write(dtm.ToString("d"))
Else
writer.Write(dtm.ToString("g"))
End If
Case Else
writer.Write(colValue.ToString())
End Select
End Sub 'RenderColumn
'*********************************************************************
'
' RenderEditColumn Method
'
' Render a column with the right UI for editing its contents.
'
'*********************************************************************
Private Sub RenderEditColumn(writer As HtmlTextWriter, rowIndex As Integer, colIndex As Integer)
Dim colName As String = _dataGridData.Columns(colIndex).ColumnName
Dim colValue As Object = _dataGridView(rowIndex)(colIndex)
If colEditValues.Contains(colName) Then
colValue = colEditValues(colName)
End If
Dim providerType As SqlDbType = CType(_dataGridSchema.Rows(colIndex)("ProviderType"), SqlDbType)
Dim columnSize As Integer = _dataGridSchema.Rows(colIndex)("ColumnSize")
Dim colIsIdentity As Boolean = CBool(_dataGridSchema.Rows(colIndex)("IsIdentity"))
If colIsIdentity Then
writer.Write(colValue.ToString())
Else
Select Case providerType
Case SqlDbType.VarChar, SqlDbType.NVarChar, SqlDbType.NText, SqlDbType.Text
If columnSize > 100 Then
RenderTextBox(writer, colName, colValue, 30, 3, columnSize)
ElseIf columnSize > 30 Then
RenderTextBox(writer, colName, colValue, 30, 1, columnSize)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -