总共分三部分:。VB,Builder和Design
Imports System.ComponentModel
Imports System.web.UI.HtmlControls
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Data
Imports System.Data.OracleClient
<DefaultProperty("ChangePage"), ControlBuilderAttribute(GetType(ChangePageBuilder)), _
ParseChildren(False), PersistChildren(False), _
Designer(GetType(ChangePageDesigner)), _
ToolboxData("<{0}:ChangePage runat=server></{0}:ChangePage>")> Public Class ChangePage
Inherits System.Web.UI.WebControls.Panel
Implements INamingContainer
Private WithEvents txtPage As newTextBox
Private WithEvents btnFirst As newButton
Private WithEvents btnNext As newButton
Private WithEvents btnPrevious As newButton
Private WithEvents btnLast As newButton
Private WithEvents btnGo As newButton
Private WithEvents lblNowPage As newLabel
Private WithEvents lblAllPage As newLabel
Private WithEvents lblAllItems As newLabel
Private WithEvents lblPage As newLabel
Private htmlTabel As Table
Private htmlRow As TableRow
Private isCreated As Boolean
Private mDataGrid As String
Public Event PageIndexChange As EventHandler
Public Sub New()
End Sub
#Region "プロパティ"
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
NotifyParentProperty(True), PersistenceMode(PersistenceMode.InnerProperty), _
Category("ChildControl"), Description("検索ボタン")> _
Public ReadOnly Property PageTextBox() As newTextBox
Get
Me.EnsureChildControls()
Return txtPage
End Get
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
NotifyParentProperty(True), PersistenceMode(PersistenceMode.InnerProperty), _
Category("ChildControl"), Description("初頁ボタン")> _
Public ReadOnly Property FirstPageButton() As newButton
Get
Me.EnsureChildControls()
Return btnFirst
End Get
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
NotifyParentProperty(True), PersistenceMode(PersistenceMode.InnerProperty), _
Category("ChildControl"), Description("次頁ボタン")> _
Public ReadOnly Property NextPageButton() As newButton
Get
Me.EnsureChildControls()
Return btnNext
End Get
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
NotifyParentProperty(True), PersistenceMode(PersistenceMode.InnerProperty), _
Category("ChildControl"), Description("前頁ボタン")> _
Public ReadOnly Property PrePageButton() As newButton
Get
Me.EnsureChildControls()
Return btnPrevious
End Get
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
NotifyParentProperty(True), PersistenceMode(PersistenceMode.InnerProperty), _
Category("ChildControl"), Description("末頁ボタン")> _
Public ReadOnly Property LastPageButton() As newButton
Get
Me.EnsureChildControls()
Return btnLast
End Get
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
NotifyParentProperty(True), PersistenceMode(PersistenceMode.InnerProperty), _
Category("ChildControl"), Description("遷移ボタン")> _
Public ReadOnly Property ChangePageButton() As newButton
Get
Me.EnsureChildControls()
Return btnGo
End Get
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
NotifyParentProperty(True), PersistenceMode(PersistenceMode.InnerProperty), _
Category("ChildControl"), Description("現在の頁ラベル")> _
Public ReadOnly Property NowPageLabel() As newLabel
Get
Me.EnsureChildControls()
Return lblNowPage
End Get
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
NotifyParentProperty(True), PersistenceMode(PersistenceMode.InnerProperty), _
Category("ChildControl"), Description("合計頁ラベル")> _
Public ReadOnly Property AllPageLabel() As newLabel
Get
Me.EnsureChildControls()
Return lblAllPage
End Get
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
NotifyParentProperty(True), PersistenceMode(PersistenceMode.InnerProperty), _
Category("ChildControl"), Description("合計項目ラベル")> _
Public ReadOnly Property AllItemsLabel() As newLabel
Get
Me.EnsureChildControls()
Return lblAllItems
End Get
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
NotifyParentProperty(True), PersistenceMode(PersistenceMode.InnerProperty), _
Category("ChildControl"), Description("頁ラベル")> _
Public ReadOnly Property PageLabel() As newLabel
Get
Me.EnsureChildControls()
Return lblPage
End Get
End Property
<Category("Behavior"), Description("データグリッド項目のコントロール"), DefaultValue("")> _
Public Property DataGrid() As String
Get
Return mDataGrid
End Get
Set(ByVal Value As String)
mDataGrid = Value
End Set
End Property
#End Region
Protected Overrides Sub CreateChildControls()
htmlTabel = New Table
htmlRow = New TableRow
If txtPage Is Nothing Then
isCreated = False
txtPage = New newTextBox
txtPage.ID = MyBase.ID & "_PageTextBox"
Else
isCreated = True
End If
If btnFirst Is Nothing Then
isCreated = False
btnFirst = New newButton
btnFirst.ID = MyBase.ID & "_FirstPageButton"
Else
isCreated = True
End If
If btnNext Is Nothing Then
isCreated = False
btnNext = New newButton
btnNext.ID = MyBase.ID & "_NextPageButton"
Else
isCreated = True
End If
If btnPrevious Is Nothing Then
isCreated = False
btnPrevious = New newButton
btnPrevious.ID = MyBase.ID & "_PrePageButton"
Else
isCreated = True
End If
If btnLast Is Nothing Then
isCreated = False
btnLast = New newButton
btnLast.ID = MyBase.ID & "_LastPageButton"
Else
isCreated = True
End If
If btnGo Is Nothing Then
isCreated = False
btnGo = New newButton
btnGo.ID = MyBase.ID & "_ChangePageButton"
Else
isCreated = True
End If
If lblNowPage Is Nothing Then
isCreated = False
lblNowPage = New newLabel
lblNowPage.ID = MyBase.ID & "_NowPageLabel"
Else
isCreated = True
End If
If lblAllPage Is Nothing Then
isCreated = False
lblAllPage = New newLabel
lblAllPage.ID = MyBase.ID & "_AllPageLabel"
Else
isCreated = True
End If
If lblAllItems Is Nothing Then
isCreated = False
lblAllItems = New newLabel
lblAllItems.ID = MyBase.ID & "_AllItemsLabel"
Else
isCreated = True
End If
If lblPage Is Nothing Then
isCreated = False
lblPage = New newLabel
lblPage.ID = MyBase.ID & "_PageLabel"
Else
isCreated = True
End If
MyBase.CreateChildControls()
If isCreated = False Then
lblPage.Text = "頁へ"
btnFirst.Text = "初頁"
btnPrevious.Text = "前頁"
btnNext.Text = "次頁"
btnLast.Text = "末頁"
btnGo.Text = "遷移"
lblNowPage.Text = "0"
lblAllPage.Text = "/0頁"
lblAllItems.Text = " 全て:0件"
txtPage.Width = Unit.Pixel(40)
End If
htmlTabel.CellPadding = 0
htmlTabel.CellSpacing = 0
htmlTabel.Rows.Add(htmlRow)
htmlRow.Cells.Add(New TableCell)
htmlRow.Cells(0).HorizontalAlign = HorizontalAlign.Left
htmlRow.Cells(0).Controls.Add(btnFirst)
htmlRow.Cells(0).Controls.Add(btnPrevious)
htmlRow.Cells(0).Controls.Add(btnNext)
htmlRow.Cells(0).Controls.Add(btnLast)
htmlRow.Cells.Add(New TableCell)
htmlRow.Cells(1).HorizontalAlign = HorizontalAlign.Left
htmlRow.Cells(1).Controls.Add(txtPage)
htmlRow.Cells.Add(New TableCell)
htmlRow.Cells(2).HorizontalAlign = HorizontalAlign.Left
htmlRow.Cells(2).Controls.Add(lblPage)
htmlRow.Cells.Add(New TableCell)
htmlRow.Cells(3).HorizontalAlign = HorizontalAlign.Left
htmlRow.Cells(3).Controls.Add(btnGo)
htmlRow.Cells.Add(New TableCell)
htmlRow.Cells(4).HorizontalAlign = HorizontalAlign.Left
htmlRow.Cells(4).Controls.Add(lblNowPage)
htmlRow.Cells.Add(New TableCell)
htmlRow.Cells(5).HorizontalAlign = HorizontalAlign.Left
htmlRow.Cells(5).Controls.Add(lblAllPage)
htmlRow.Cells.Add(New TableCell)
htmlRow.Cells(6).HorizontalAlign = HorizontalAlign.Left
htmlRow.Cells(6).Controls.Add(lblAllItems)
MyBase.Controls.Add(htmlTabel)
End Sub
Protected Overrides Sub Render(ByVal output As System.Web.UI.HtmlTextWriter)
MyBase.EnsureChildControls()
RenderChildren(output)
End Sub
Protected Overrides Sub AddParsedSubObject(ByVal obj As Object)
Dim btnIdName As Array
Dim lblIdName As Array
If TypeOf obj Is newTextBox Then
txtPage = obj
End If
If TypeOf obj Is newButton Then
btnIdName = Split(CType(obj, newButton).ID.ToString, "_")
Select Case btnIdName(1).ToString
Case "FirstPageButton"
Me.btnFirst = obj
Case "NextPageButton"
Me.btnNext = obj
Case "PrePageButton"
Me.btnPrevious = obj
Case "LastPageButton"
Me.btnLast = obj
Case "ChangePageButton"
Me.btnGo = obj
End Select
End If
If TypeOf obj Is newLabel Then
lblIdName = Split(CType(obj, newLabel).ID.ToString, "_")
Select Case lblIdName(1).ToString
Case "NowPageLabel"
Me.lblNowPage = obj
Case "AllPageLabel"
Me.lblAllPage = obj
Case "AllItemsLabel"
Me.lblAllItems = obj
Case "PageLabel"
Me.lblPage = obj
End Select
End If
End Sub
Private Sub btnFirst_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnFirst.Click
MyBase.EnsureChildControls()
If Not Page.FindControl(DataGrid) Is Nothing Then
CType(Page.FindControl(DataGrid), DataGrid).CurrentPageIndex = 0
txtPage.Text = ""
RaiseEvent PageIndexChange(Me, e)
Call NewPageDataBind()
Else
Throw New Exception(DataGrid & "を探し当てていない")
End If
End Sub
Private Sub btnLast_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnLast.Click
Dim pageCount As Integer
MyBase.EnsureChildControls()
If Not Page.FindControl(DataGrid) Is Nothing Then
pageCount = CType(Page.FindControl(DataGrid), DataGrid).PageCount
CType(Page.FindControl(DataGrid), DataGrid).CurrentPageIndex = _
Math.Max(pageCount - 1, 0)
txtPage.Text = ""
RaiseEvent PageIndexChange(Me, e)
Call NewPageDataBind()
Else
Throw New Exception(DataGrid & "を探し当てていない")
End If
End Sub
Private Sub btnNext_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnNext.Click
Dim currentPageIndex As Integer
Dim pageCount As Integer
MyBase.EnsureChildControls()
If Not Page.FindControl(DataGrid) Is Nothing Then
pageCount = CType(Page.FindControl(DataGrid), DataGrid).PageCount
currentPageIndex = CType(Page.FindControl(DataGrid), DataGrid).CurrentPageIndex
CType(Page.FindControl(DataGrid), DataGrid).CurrentPageIndex = _
Math.Min(currentPageIndex + 1, pageCount - 1)
txtPage.Text = ""
RaiseEvent PageIndexChange(Me, e)
Call NewPageDataBind()
Else
Throw New Exception(DataGrid & "を探し当てていない")
End If
End Sub
Private Sub btnPrevious_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrevious.Click
Dim currentPageIndex As Integer
MyBase.EnsureChildControls()
If Not Page.FindControl(DataGrid) Is Nothing Then
currentPageIndex = CType(Page.FindControl(DataGrid), DataGrid).CurrentPageIndex
CType(Page.FindControl(DataGrid), DataGrid).CurrentPageIndex = _
Math.Max(currentPageIndex - 1, 0)
txtPage.Text = ""
RaiseEvent PageIndexChange(Me, e)
Call NewPageDataBind()
Else
Throw New Exception(DataGrid & "を探し当てていない")
End If
End Sub
Public Sub NewPageDataBind()
Dim recordCount As Integer
Dim pageCount As Integer
Dim pageDgdSize As Integer
Dim CurrentPageIndex As Integer
CurrentPageIndex = CType(Page.FindControl(DataGrid), DataGrid).CurrentPageIndex
pageDgdSize = CType(Page.FindControl(DataGrid), DataGrid).PageSize
pageCount = CType(Page.FindControl(DataGrid), DataGrid).PageCount
If (CType(Page.FindControl(DataGrid), DataGrid).DataSource Is Nothing) Then
SetButtonState(0, CurrentPageIndex)
Exit Sub
End If
If (CType(Page.FindControl(DataGrid), DataGrid).DataSource.GetType().ToString(). _
ToLower() = "system.data.datatable") Then
recordCount = CType(Page.FindControl(DataGrid), DataGrid).DataSource.Rows.Count
ElseIf (CType(Page.FindControl(DataGrid), DataGrid).DataSource.GetType().ToString(). _
ToLower() = "system.data.dataview") Then
recordCount = CType(Page.FindControl(DataGrid), DataGrid).DataSource.Count
ElseIf (CType(Page.FindControl(DataGrid), DataGrid).DataSource.GetType().ToString(). _
ToLower() = "system.data.dataset") Then
recordCount = CType(Page.FindControl(DataGrid), DataGrid).DataSource.Tables(0). _
Rows.Count
End If
If pageCount.ToString = 0 Then
lblNowPage.Text = 0
Else
lblNowPage.Text = _
(CType(Page.FindControl(DataGrid), DataGrid).CurrentPageIndex + 1).ToString()
End If
lblAllPage.Text = "/" & pageCount.ToString() & "頁"
lblAllItems.Text = " 全て:" & recordCount.ToString() & "件"
SetButtonState(pageCount, CurrentPageIndex)
End Sub
Public Sub SetButtonState(ByVal pageCount As Integer, ByVal CurrentPageIndex As Integer)
btnFirst.Enabled = (0 < CurrentPageIndex)
btnPrevious.Enabled = (0 < CurrentPageIndex)
btnNext.Enabled = (CurrentPageIndex < pageCount - 1)
btnLast.Enabled = (CurrentPageIndex < pageCount - 1)
btnGo.Enabled = (1 < pageCount)
txtPage.Enabled = (1 < pageCount)
End Sub
Private Sub btnGo_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGo.Click
Dim PageCount As Integer
If Not Page.FindControl(DataGrid) Is Nothing Then
PageCount = CType(Page.FindControl(DataGrid), DataGrid).PageCount
Else
Throw New Exception(DataGrid & "を探し当てていない")
Exit Sub
End If
If txtPage.Text.ToString.Equals("") Then
Exit Sub
Else
If PageCount < CInt(txtPage.Text) Then
txtPage.Text = ""
Exit Sub
Else
If Math.Min(PageCount - 1, CInt(txtPage.Text) - 1) < 0 Then
txtPage.Text = ""
Exit Sub
End If
CType(Page.FindControl(DataGrid), DataGrid).CurrentPageIndex = _
Math.Min(PageCount - 1, CInt(txtPage.Text) - 1)
txtPage.Text = ""
RaiseEvent PageIndexChange(Me, e)
Call NewPageDataBind()
End If
End If
End Sub
Private Sub ChangePage_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
MyBase.EnsureChildControls()
If DataGrid Is Nothing Then
Throw New Exception("必要なDataGridプロパティが設定されていない")
Exit Sub
End If
If Not Page.FindControl(DataGrid) Is Nothing Then
Call NewPageDataBind()
Else
Throw New Exception(DataGrid & "を探し当てていない")
End If
End Sub
End Class
Imports System.ComponentModel
Imports System.Web.UI
Public Class ChangePageBuilder
Inherits ControlBuilder
Public Overrides Function GetChildControlType(ByVal tagName As String, ByVal attributes As IDictionary) As Type
If tagName.ToLower().EndsWith("newtextbox") Then
Return GetType(newTextBox)
End If
If tagName.ToLower().EndsWith("newbutton") Then
Return GetType(newButton)
End If
If tagName.ToLower().EndsWith("newlabel") Then
Return GetType(newLabel)
End If
Return Nothing
End Function
End Class
Imports System.IO
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.Design
Imports System.ComponentModel
Imports System.ComponentModel.Design
Public Class ChangePageDesigner
Inherits ControlDesigner
Public Overrides Function GetDesignTimeHtml() As String
Dim strWriter As StringWriter
Dim htmlWriter As HtmlTextWriter
Dim control As ChangePage
strWriter = New StringWriter
htmlWriter = New HtmlTextWriter(strWriter)
control = CType(Me.Component, ChangePage)
MyBase.GetDesignTimeHtml()
If Not control.HasControls Then
Return GetEmptyDesignTimeHtml()
End If
control.RenderControl(htmlWriter)
Return strWriter.ToString
End Function
Public Overrides Function GetPersistInnerHtml() As String
Dim strWriter As StringWriter
Dim htmlWriter As HtmlTextWriter
Dim control As ChangePage
strWriter = New StringWriter
htmlWriter = New HtmlTextWriter(strWriter)
control = CType(Me.Component, ChangePage)
MyBase.GetPersistInnerHtml()
htmlWriter.Write(ControlPersister.PersistControl(control.FirstPageButton))
htmlWriter.Write(ControlPersister.PersistControl(control.PrePageButton))
htmlWriter.Write(ControlPersister.PersistControl(control.NextPageButton))
htmlWriter.Write(ControlPersister.PersistControl(control.LastPageButton))
htmlWriter.Write(ControlPersister.PersistControl(control.PageTextBox))
htmlWriter.Write(ControlPersister.PersistControl(control.PageLabel))
htmlWriter.Write(ControlPersister.PersistControl(control.ChangePageButton))
htmlWriter.Write(ControlPersister.PersistControl(control.NowPageLabel))
htmlWriter.Write(ControlPersister.PersistControl(control.AllPageLabel))
htmlWriter.Write(ControlPersister.PersistControl(control.AllItemsLabel))
Return strWriter.ToString
End Function
End Class