古典的なシナリオ: ユーザー入力を受け取り、検索結果を取得し、それをページに表示してユーザーに表示します。次に、First、Next、Previous などのボタンを表示する必要があり、ユーザーの現在のページをビューステートに維持します。すべてが良好で、正常に動作します。
次に、クリック可能なページ番号を実装する必要があります。1-2-3-4-5-6など
それらのレンダリングは簡単です。実行時に linkbutton コントロールを生成し、コマンド引数にページ番号を追加し、ハンドラーを追加して、クリックが処理されるようにします。次に、プレースホルダーに追加すると、期待どおりに表示されます。
しかし、もし私がまだ頭を剃っていなかったら、毎回期待通りにイベントを発生させるために髪を引っ張っていたでしょう。
ページングリンクボタンが呼び出されたときにイベントが常に接続され、起動できるようにするにはどうすればよいですか?
以下は、コードの重要な部分です。(できれば) 理解しやすくするためのいくつかの疑似、私が行っていることです。
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
Search()
End If
End Sub
Sub Search
'Misc databinding stuff, searches and displays results for the page specified in Me.CurrentPage
RenderPagingControls()
End Sub
Sub RenderPagingControls
'loop throug pagenumbers, Build a linkbutton control, add it to a placeholder
AddHandler lbn.Click, AddressOf lbnNumber_Click
lblPageNumbers.Controls.Add(lbn)
...
End Sub
Protected Sub lbnNumber_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim b As LinkButton = CType(sender, LinkButton)
Me.CurrentPage = CInt(b.CommandArgument)
Search()
End Sub
Public Property CurrentPage() As Integer
Get
Dim o As Object = Me.ViewState("CurrentPage")
If o Is Nothing Then
Return 1
Else
Return CType(o, Integer)
End If
End Get
Set(ByVal value As Integer)
Me.ViewState("CurrentPage") = value
End Set
End Property
Protected Sub lbnNumber_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim b As LinkButton = CType(sender, LinkButton)
Me.CurrentPage = CInt(b.CommandArgument)
Search()
End Sub