Q:

PagedDataSource not showing data in subsequent pages

It's probably something small, but I haven't been figure out why the following isn't working completely. The first time the user submits the search, the first page of search results show up properly. However, when the user tries to navigate by using the Previous and Next Page buttons, the repeater doesn't show the appropriate data from the DataTable.
search.aspx
<asp:Repeater ID="rptSearchResults" runat="server" OnItemDataBound="rptSearchResults_ItemDataBound">
    <ItemTemplate>
        <div>
            <asp:Literal ID="ltlCustName" runat="server" />
        </div>
    </ItemTemplate>
</asp:Repeater>

search.aspx.vb
Public dtCustomers As DataTable = New DataTable()
Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs) Handles Me.Load
    ' Check to see if this is the first time postback-ing to itself.
    blnFirstPostBack = (Request.Form("firstpb") = "1")

    ' When the page first loads, show the search form with search options.
    If Not Page.IsPostBack Then
        Session("StoredDT") = Nothing
        ShowSearchForm()
    ' Once the form is submitted, show the search results.
    Else
        Response.Write("DEBUG: Get Data")
        If blnFirstPostBack Then
            GatherFormData()
            dtCustomers = BuildDT()
            Session("StoredDT") = dtCustomers
            BindData()
        ElseIf Not Session("StoredDT") Is Nothing Then
            dtCustomers = Session("StoredDT")
        End If
    End If
End Sub

Sub BindData()
    Response.Write("DEBUG: Bind Data")
    ' At this point, I've checked that the dtCustomers is showing the proper data (e.g., grabbing from session when appropriate).
    Dim objPDS As PagedDataSource = New PagedDataSource()
    objPDS.DataSource = dtCustomers.DefaultView
    objPDS.AllowPaging = True
    objPDS.PageSize = intNumPerPage
    ' I've checked that Me.ViewState("_CurrentPage") gets updated to the correct page.
    objPDS.CurrentPageIndex = Me.ViewState("_CurrentPage")
    rptSearchResults.DataSource = objPDS
    ' I'm not sure if the error is here but although the dtCustomers is the proper data, the PagedDataSource and the binding here doesn't seem to play nice.
    Call rptSearchResults.DataBind()
End Sub

' Subroutine called when the previous page button is pressed.
Sub GoToPrevPage()
    Response.Write("DEBUG: Prev Page")
    ' Set viewstate variable to the previous page.
    Me.ViewState("_CurrentPage") -= 1
    BindData()
End Sub

' Subroutine called when the next page button is pressed.
Sub GoToNextPage()
    Response.Write("DEBUG: Next Page")
    ' Set viewstate variable to the next page.
    Me.ViewState("_CurrentPage") += 1
    BindData()
End Sub

Protected Sub rptSearchResults_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptSearchResults.ItemDataBound
    Dim item As RepeaterItem = e.Item
    Dim strCustName As String = ""
    If (item.ItemType = ListItemType.Item) Or (item.ItemType = ListItemType.AlternatingItem) Then
        strCustName = e.Item.DataItem("CustName")
        Dim ltlCustName As Literal = CType(e.Item.FindControl("ltlCustName"), Literal)
        ltlCustName.Text = strCustName
    End If
End Sub

Sample Page 1 (shows proper data):
DEBUG: Get Data
DEBUG: Bind Data
Laurence Clinton
John Doe
Sean King
Jane Smith

Sample Page 2 (does not show proper data but shows enough spaces for the missing data):
DEBUG: Get Data
DEBUG: Next Page
DEBUG: Bind Data
[no name showing here 5]
[no name showing here 6]
[no name showing here 7]
[no name showing here 8]

Please excuse the abbreviated code but the actual code is massive so the simplification is to make it easier to get to the heart of the issue.
Let me know if any of that was unclear or if more code is required. Thanks in advance!
Update 2/19/2013:
So after fiddling with the code a bit, I think the error happens in the repeater subroutine. The original literal inside of the repeater works now. For some reason I don't think it worked before but it works fine now. The problem is when we go a step further using a custom control inside of the repeater subroutine. It seems that the information doesn't get passed into the control. The control gets called properly because supporting HTML found only within the control gets outputted properly but the customer information that we try to pass into the control doesn't get inside. Here is the modified code:
search.aspx
<asp:Repeater ID="rptSearchResults" runat="server" OnItemDataBound="rptSearchResults_ItemDataBound">
    <ItemTemplate>
        <div>
            <asp:Literal ID="ltlCustName" runat="server" />
            <Acme:CustInfo ID="AcmeCustInfo" runat="server" />
        </div>
    </ItemTemplate>
</asp:Repeater>

search.aspx.vb
Protected Sub rptSearchResults_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptSearchResults.ItemDataBound
    Dim item As RepeaterItem = e.Item
    Dim strCustName As String = ""
    If (item.ItemType = ListItemType.Item) Or (item.ItemType = ListItemType.AlternatingItem) Then
        strCustName = e.Item.DataItem("CustName")

        ' This literal properly shows the customer name on subsequent pages so the customer name reaches this point properly.
        Dim ltlCustName As Literal = CType(e.Item.FindControl("ltlCustName"), Literal)
        ltlCustName.Text = strCustName

        ' This control gets called properly but strCustName doesn't 
        ' get passed into the control. The control works fine for the
        ' first page but subsequent pages do not work. Also, the 
        ' control works fine when PagedDataSource is not used.
        Dim AcmeCustInfo As CustInfo = CType(e.Item.FindControl("AcmeCustInfo"), CustInfo)
        AcmeCustInfo.CustName = strCustName
    End If
End Sub

Per Request from Ann
Here is the code for CustInfo. Needless to say, a lot of the fluff has been stripped out to focus on the issue but if anything is missing that will be useful, please let me know and I'll update the example accordingly.
custinfo.ascx
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="CustInfo.ascx.vb" Inherits="CustInfo" %>

<div style="border: 1px solid black;">
    <asp:Literal ID="ltlCustName" runat="server" />
</div>

custinfo.ascx.vb
Imports System
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.HtmlControls
Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports System.Web.HttpUtility

Partial Class CustInfo
    Inherits System.Web.UI.UserControl

    Private _CustName As String = ""

    Public Property CustName() As String
        Get
            Return _CustName
        End Get
        Set(value As String)
            _CustName = value
        End Set
    End Property

    Public Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs) Handles Me.Load
        Dim ltlCustName As Literal = CType(FindControl("ltlCustName"), Literal)
        ltlCustName.Text = "<b>Name: " & CustName & "</b>"
    End Sub
End Class

A:

I'm not a PagedDataSource expert, but I've used user controls extensively.
You're setting the value of the literal in your CustInfo control in the Load subroutine.  If I'm not mistaken, that's going to get called when the CustInfo control is created.  That would happen before OnItemDataBound is called, so -- I think -- the Load subroutine will happen and the value of the literal be set (to an empty string) before you assign the value of the CustName property.  To fix this, try setting the value of the literal later, such as in the PreRender subroutine.
It looks like you're binding on every postback, so the following shouldn't be an issue, but if you aren't, here are some thing that might affect you:

ItemDataBound only runs if you re-bind.  If you have ViewState turned on for your repeater, the controls will be recreated on postback, and ItemCreated would run, but ItemDataBound wouldn't.  So you'd never re-set your CustName property.  And this would matter because ...
... your CustName property has a variable as a backing store:  it isn't preserved in ViewState.  So when the user control is recreated, the CustName property you previously set won't be there anymore: your literal's contents will be set to the empty string that is the default value of the CustName property.   

Those two together would give exactly the behavior you've described.  But since it looks like you do bind on every postback (eventually) that may not be the issue.  I'm including it for completeness.  

