📄 defaultvb.aspx.vb
字号:
Imports System
Imports System.Data
Imports System.Collections
Imports System.Web.SessionState
Imports Telerik.QuickStart
Imports Telerik.WebControls
Namespace Telerik.GridExamplesVBNET.Programming.CustomPaging
Public MustInherit Class DefaultVB
Inherits XhtmlPage
Protected WithEvents RadGrid1 As RadGrid
Protected TextBox1 As System.Web.UI.WebControls.TextBox
Protected WithEvents Button1 As System.Web.UI.WebControls.Button
Protected RegularExpressionValidator1 As System.Web.UI.WebControls.RegularExpressionValidator
Protected RequiredFieldValidator1 As System.Web.UI.WebControls.RequiredFieldValidator
'Custom paging
Private startIndex As Integer = 0
Private myDataLayer1 As DataLayer
Private ReadOnly Property MyDataLayer() As DataLayer
Get
If (Me.myDataLayer1 Is Nothing) Then
Me.myDataLayer1 = New DataLayer(Me.Session)
End If
Return Me.myDataLayer1
End Get
End Property
Private Sub PageChanging(ByVal newPageIndex As Integer)
'change page, so datalayer to generate fresh one
Me.MyDataLayer.ResetDataSource()
'Update start based on grid's new page index changes
startIndex = newPageIndex * RadGrid1.MasterTableView.PageSize
End Sub
#Region "Web Form Designer generated code"
Protected Overrides Sub OnInit(ByVal e As EventArgs)
InitializeComponent()
MyBase.OnInit(e)
End Sub
Private Sub InitializeComponent()
End Sub
#End Region
Private Sub RadGrid1_NeedDataSource(ByVal [source] As Object, ByVal e As GridNeedDataSourceEventArgs) Handles RadGrid1.NeedDataSource
RadGrid1.DataSource = Me.MyDataLayer.GetDataSource(Me.startIndex, RadGrid1.MasterTableView.PageSize).DefaultView()
End Sub
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not IsPostBack Then
Me.MyDataLayer.Initialize(Integer.Parse(TextBox1.Text))
End If
End Sub
Private Sub RadGrid1_PageIndexChanged(ByVal source As Object, ByVal e As Telerik.WebControls.GridPageChangedEventArgs) Handles RadGrid1.PageIndexChanged
'Update start index when page index changes
Me.PageChanging(e.NewPageIndex)
End Sub
Private Sub RadGrid1_DeleteCommand(ByVal source As Object, ByVal e As Telerik.WebControls.GridCommandEventArgs) Handles RadGrid1.DeleteCommand
Dim id As Integer = Integer.Parse(CType(e.Item, GridDataItem)("ID").Text)
Me.MyDataLayer.DeleteItem(id)
'Update count based on number of records left
RadGrid1.MasterTableView.VirtualItemCount = Me.MyDataLayer.Count
'Set new page index
If (RadGrid1.MasterTableView.VirtualItemCount = 0) Then
RadGrid1.MasterTableView.CurrentPageIndex = 0
Else
Dim lastPageIndex As Integer = ((RadGrid1.MasterTableView.VirtualItemCount + RadGrid1.MasterTableView.PageSize - 1) \ _
RadGrid1.MasterTableView.PageSize) - 1
If (RadGrid1.MasterTableView.CurrentPageIndex > lastPageIndex) Then
RadGrid1.MasterTableView.CurrentPageIndex = lastPageIndex
End If
End If
'Update start index, calculation vars
Me.PageChanging(RadGrid1.MasterTableView.CurrentPageIndex)
End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.PageChanging(0)
Me.MyDataLayer.Initialize(Integer.Parse(TextBox1.Text))
Me.RadGrid1.MasterTableView.VirtualItemCount = Me.MyDataLayer.Count
Me.RadGrid1.MasterTableView.CurrentPageIndex = 0
Me.RadGrid1.Rebind()
End Sub
End Class
Public Class DataLayer
Public Sub New(ByVal Session As HttpSessionState)
Me.mySession = Session
End Sub
Private mySession As HttpSessionState
Private ReadOnly Property Session() As HttpSessionState
Get
Return mySession
End Get
End Property
Public Property Count() As Integer
Get
Dim MyRes As Object = Me.Session("_vc")
If (Not MyRes Is Nothing) Then
Return CType(MyRes, Integer)
End If
Return 11
End Get
Set(ByVal Value As Integer)
Me.Session("_vc") = Value
End Set
End Property
Public Sub Initialize(ByVal Count As Integer)
Me.Count = Count
Me.ResetDeletedItems()
Me.ResetDataSource()
End Sub
'Prepare a set of items only for the selected page
Public ReadOnly Property GetDataSource(ByVal startIndex As Integer, ByVal PageSize As Integer) As DataTable
Get
'Is it cahced already?
Dim dt As DataTable = CType(Me.Session("datasource"), DataTable)
'no, then recreate
If (dt Is Nothing) Then
dt = New DataTable
Dim dr As DataRow
dt.Columns.Add(New DataColumn("ID", GetType(Int32)))
dt.PrimaryKey = New DataColumn() {dt.Columns("ID")}
dt.Columns.Add(New DataColumn("Property1", GetType(String)))
dt.Columns.Add(New DataColumn("Property2", GetType(Double)))
Dim i As Integer = startIndex
Dim j As Integer = startIndex
While j < startIndex + PageSize
'Only VirtualCount number of Items
If j >= Me.Count Then
Exit While
End If
'preserve deleted items
If Not Me.DeletedItems(i) Is Nothing Then
GoTo Continue
End If
dr = dt.NewRow()
dr(0) = i
dr(1) = "Item " + (1 + i).ToString()
dr(2) = 1.23 * (100 - (i + 1))
dt.Rows.Add(dr)
j += 1
Continue:
i += 1
End While
Session("datasource") = dt
End If
Return dt
End Get
End Property
Public Sub ResetDeletedItems()
Me.Session("DeletedItems") = Nothing
End Sub
Public Sub ResetDataSource()
Me.Session("datasource") = Nothing
End Sub
Public Sub DeleteItem(ByVal ID As Integer)
Dim dt As DataTable = CType(Me.Session("datasource"), DataTable)
If Not dt Is Nothing Then
dt.Rows.Find(ID).Delete()
dt.AcceptChanges()
End If
'set the item deleted
Me.DeletedItems(ID) = True
'Update count
Me.Count = Me.Count - 1
End Sub
Public ReadOnly Property DeletedItems() As Hashtable
Get
Dim MyRes As Hashtable = CType(Me.Session("DeletedItems"), Hashtable)
If (MyRes Is Nothing) Then
MyRes = New Hashtable
Me.Session("DeletedItems") = MyRes
End If
Return MyRes
End Get
End Property
End Class
End Namespace
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -