I have a listview with a datapager that works fine for most things. I also have a dropdown that allows limiting the listview datasource to a subset. The dropdown fires off the database query just fine but the pager doesn't reset to page 1. In the selected
index changed event for the dropdown the listview is found but the datapager isn't. Here is the relevant html and code behind:
The item templates take up about an additional 1600 lines so I left that part off. Each item has just under 100 fields, which is why the item templates are so big.
The relevant code behind:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
HeatPumpSpec = New TBINData
If Not IsPostBack Then
'load ddlManufacturer with manufacturer names. Start with blank. On change causes refining of listview datasource
dtHeatPumpMan = HeatPumpSpec.GetHeatPumpManufacturer()
dtHeatPumpMan.PrimaryKey = New DataColumn() {dtHeatPumpMan.Columns("HeatPumpManufacturerID_PK")}
If dtHeatPumpMan.Rows.Contains("0") Then
Else
drHeatPumpMan = dtHeatPumpMan.NewRow
drHeatPumpMan("HeatPumpManufacturerName") = " "
drHeatPumpMan("HeatPumpManufacturerID_PK") = "0"
dtHeatPumpMan.Rows.Add(drHeatPumpMan)
End If
ddlManufacturer.DataSource = dtHeatPumpMan
Me.ddlManufacturer.DataTextField = "HeatPumpManufacturerName"
Me.ddlManufacturer.DataValueField = "HeatPumpManufacturerID_PK"
ddlManufacturer.DataBind()
lvHeatPumpModel.DataSource = HeatPumpSpec.GetHeatPumpMaint()
lvHeatPumpModel.DataBind()
End If
End Sub
Protected Sub ddlManufacturer_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ddlManufacturer.SelectedIndexChanged
Session("HeatPumpManSelected") = Me.ddlManufacturer.SelectedValue
'get selected value
lvHeatPumpModel.DataSource = HeatPumpSpec.GetHeatPumpMaint(Me.ddlManufacturer.SelectedValue)
lvHeatPumpModel.DataBind()
' When I type the datapager ID here it finds nothing 'HeatPumpModelDataPager
End Sub
Protected Sub lvHeatPumpModel_PagePropertiesChanging(sender As Object, e As PagePropertiesChangingEventArgs) Handles lvHeatPumpModel.PagePropertiesChanging
lvHeatPumpModel.DataBind() 'rebind List View
End Sub
I've found plenty of examples and posts where people want to do something with the datapager in the code behind and it works fine to just have the datapager ID. When I do exactly the same thing as the examples or solutions it doesn't work.
I decided to just experiment so I tried the following set of code;
Dim ParticularDataPager As DataPager
ParticularDataPager = TryCast(lvHeatPumpModel.FindControl("HeatPumpModelDataPager"), DataPager)
This kicks no compiler or runtime errors but the return value to ParticularDataPager is always Nothing.
How do I get a valid reference to the Datapager with the ID of HeatPumpModelDataPager that is in my LayoutTemplate of my listview with the ID of lvHeatPumpModel?
I've tried in both ddlManufacturer_SelectedIndexChanged and lvHeatPumpModel_PagePropertiesChanging. Currently The code looks like this:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
HeatPumpSpec = New TBINData
If Not IsPostBack Then
'load ddlManufacturer with manufacturer names. Start with blank. On change causes refining of listview datasource
dtHeatPumpMan = HeatPumpSpec.GetHeatPumpManufacturer()
dtHeatPumpMan.PrimaryKey = New DataColumn() {dtHeatPumpMan.Columns("HeatPumpManufacturerID_PK")}
If dtHeatPumpMan.Rows.Contains("0") Then
Else
drHeatPumpMan = dtHeatPumpMan.NewRow
drHeatPumpMan("HeatPumpManufacturerName") = " "
drHeatPumpMan("HeatPumpManufacturerID_PK") = "0"
dtHeatPumpMan.Rows.Add(drHeatPumpMan)
Dim vHeatPumpMan As DataView = dtHeatPumpMan.DefaultView
vHeatPumpMan.Sort = "HeatPumpManufacturerID_PK Asc"
dtHeatPumpMan = vHeatPumpMan.ToTable
End If
ddlManufacturer.DataSource = dtHeatPumpMan
Me.ddlManufacturer.DataTextField = "HeatPumpManufacturerName"
Me.ddlManufacturer.DataValueField = "HeatPumpManufacturerID_PK"
ddlManufacturer.DataBind()
lvHeatPumpModel.DataSource = HeatPumpSpec.GetHeatPumpMaint()
lvHeatPumpModel.DataBind()
Else
' Me.ddlManufacturer.SelectedValue = Session("HeatPumpManSelected")
End If
End Sub
Protected Sub ddlManufacturer_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ddlManufacturer.SelectedIndexChanged
Session("HeatPumpManSelected") = Me.ddlManufacturer.SelectedValue
lvHeatPumpModel.DataSource = HeatPumpSpec.GetHeatPumpMaint(Me.ddlManufacturer.SelectedValue)
lvHeatPumpModel.DataBind()
End Sub
Protected Sub lvHeatPumpModel_PagePropertiesChanging(sender As Object, e As PagePropertiesChangingEventArgs) Handles lvHeatPumpModel.PagePropertiesChanging
Dim pager As DataPager = TryCast(lvHeatPumpModel.FindControl("HeatPumpModelDataPager"), DataPager)
pager.SetPageProperties(1, 5, False)
End Sub
With this set-up I get the paging working on initial page load but that has always worked. The problem I have is that when an item is selected from the dropdown the program hits the database and loads only the records that meet the criteria and then rebinds
the datasource. This gets me the records I need to see but if I'm on page 4 and the selection only covers page 1 I see an empty listview with the page navigation available for pages that don't exist.
If I step through in debug I now get a reference to the datapager but the SetPageProperties doesn't change any values. If I browse the pager instance of DataPager the querystringvalue is still 4 after the SetPageProperties runs. What do I need to do to
get SetPageProperties to actually work?
Protected Sub lvHeatPumpModel_PagePropertiesChanging(sender As Object, e As PagePropertiesChangingEventArgs) Handles lvHeatPumpModel.PagePropertiesChanging
Hi,
You can first try to find out the specific control out of LayoutTemplate, because I'm afraid you cannot find that control when in Layout Template:
I'm marking this as answered because the first half of my question is answered. By moving the datapager out of the listview the code behind can now see it. I wasn't getting the functionality I wanted but when I tidied up the code I realized a line was
commented out that shouldn't be. When I uncommented that it all worked.
Protected Sub ddlManufacturer_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ddlManufacturer.SelectedIndexChanged
lvHeatPumpModel.DataSource = HeatPumpSpec.GetHeatPumpMaint(Me.ddlManufacturer.SelectedValue)
Session("HeatPumpManSelected") = Me.ddlManufacturer.SelectedValue
HeatPumpModelDataPager.SetPageProperties(0, 5, False)
lvHeatPumpModel.DataBind()
End Sub
Protected Sub lvHeatPumpModel_PagePropertiesChanging(sender As Object, e As PagePropertiesChangingEventArgs) Handles lvHeatPumpModel.PagePropertiesChanging
lvHeatPumpModel.DataBind() 'rebind List View
End Sub
kraznodar
Contributor
3336 Points
889 Posts
Need dropdown selection to reset datapager to page 1 but datapager isn't found by dropdown code
Jan 09, 2013 01:48 PM|LINK
I have a listview with a datapager that works fine for most things. I also have a dropdown that allows limiting the listview datasource to a subset. The dropdown fires off the database query just fine but the pager doesn't reset to page 1. In the selected index changed event for the dropdown the listview is found but the datapager isn't. Here is the relevant html and code behind:
<asp:Label ID="lblHeatPumpMan" runat="Server" Text='Select Heat Pump Manufacturer: '></asp:Label>
<asp:DropDownList ID="ddlManufacturer" runat="server" AutoPostBack="true">
</asp:DropDownList>
<asp:ListView ID="lvHeatPumpModel" DataKeyNames="ModelNumber_PK" runat="server" onitemediting="lvHeatPumpModel_ItemEditing" onitemupdating="lvHeatPumpModel_ItemUpdating" OnPagePropertiesChanging="lvHeatPumpModel_PagePropertiesChanging"
onitemcanceling="lvHeatPumpModel_ItemCanceling" onitemdeleting="lvHeatPumpModel_ItemDeleting" InsertItemPosition="LastItem" oniteminserting="lvHeatPumpModel_ItemInserting">
<LayoutTemplate>
<table style="width:800px; border:1 collapse black;" runat="server" id="tblHeatPumpModels">
<tr runat="server" id="itemPlaceholder" />
</table>
<asp:DataPager runat="server" ID="HeatPumpModelDataPager" PageSize="5" PagedControlID="lvHeatPumpModel" QueryStringField="page">
<Fields>
<asp:NumericPagerField />
<asp:NextPreviousPagerField ShowFirstPageButton="True" ShowLastPageButton="True"
FirstPageText="|<< " LastPageText=" >>|" NextPageText=" > " PreviousPageText=" < " />
</Fields>
</asp:DataPager>
</LayoutTemplate>
The item templates take up about an additional 1600 lines so I left that part off. Each item has just under 100 fields, which is why the item templates are so big.
The relevant code behind:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
HeatPumpSpec = New TBINData
If Not IsPostBack Then
'load ddlManufacturer with manufacturer names. Start with blank. On change causes refining of listview datasource
dtHeatPumpMan = HeatPumpSpec.GetHeatPumpManufacturer()
dtHeatPumpMan.PrimaryKey = New DataColumn() {dtHeatPumpMan.Columns("HeatPumpManufacturerID_PK")}
If dtHeatPumpMan.Rows.Contains("0") Then
Else
drHeatPumpMan = dtHeatPumpMan.NewRow
drHeatPumpMan("HeatPumpManufacturerName") = " "
drHeatPumpMan("HeatPumpManufacturerID_PK") = "0"
dtHeatPumpMan.Rows.Add(drHeatPumpMan)
End If
ddlManufacturer.DataSource = dtHeatPumpMan
Me.ddlManufacturer.DataTextField = "HeatPumpManufacturerName"
Me.ddlManufacturer.DataValueField = "HeatPumpManufacturerID_PK"
ddlManufacturer.DataBind()
lvHeatPumpModel.DataSource = HeatPumpSpec.GetHeatPumpMaint()
lvHeatPumpModel.DataBind()
End If
End Sub
Protected Sub ddlManufacturer_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ddlManufacturer.SelectedIndexChanged
Session("HeatPumpManSelected") = Me.ddlManufacturer.SelectedValue
'get selected value
lvHeatPumpModel.DataSource = HeatPumpSpec.GetHeatPumpMaint(Me.ddlManufacturer.SelectedValue)
lvHeatPumpModel.DataBind()
' When I type the datapager ID here it finds nothing 'HeatPumpModelDataPager
End Sub
Protected Sub lvHeatPumpModel_PagePropertiesChanging(sender As Object, e As PagePropertiesChangingEventArgs) Handles lvHeatPumpModel.PagePropertiesChanging
lvHeatPumpModel.DataBind() 'rebind List View
End Sub
kraznodar
Contributor
3336 Points
889 Posts
Re: Need dropdown selection to reset datapager to page 1 but datapager isn't found by dropdown co...
Jan 10, 2013 03:47 PM|LINK
I've found plenty of examples and posts where people want to do something with the datapager in the code behind and it works fine to just have the datapager ID. When I do exactly the same thing as the examples or solutions it doesn't work.
I decided to just experiment so I tried the following set of code;
Dim ParticularDataPager As DataPager
ParticularDataPager = TryCast(lvHeatPumpModel.FindControl("HeatPumpModelDataPager"), DataPager)
This kicks no compiler or runtime errors but the return value to ParticularDataPager is always Nothing.
How do I get a valid reference to the Datapager with the ID of HeatPumpModelDataPager that is in my LayoutTemplate of my listview with the ID of lvHeatPumpModel?
Decker Dong ...
All-Star
118619 Points
18779 Posts
Re: Need dropdown selection to reset datapager to page 1 but datapager isn't found by dropdown co...
Jan 11, 2013 08:39 AM|LINK
Hi,
Where did you put the codes?
kraznodar
Contributor
3336 Points
889 Posts
Re: Need dropdown selection to reset datapager to page 1 but datapager isn't found by dropdown co...
Jan 11, 2013 02:59 PM|LINK
I've tried in both ddlManufacturer_SelectedIndexChanged and lvHeatPumpModel_PagePropertiesChanging. Currently The code looks like this:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
HeatPumpSpec = New TBINData
If Not IsPostBack Then
'load ddlManufacturer with manufacturer names. Start with blank. On change causes refining of listview datasource
dtHeatPumpMan = HeatPumpSpec.GetHeatPumpManufacturer()
dtHeatPumpMan.PrimaryKey = New DataColumn() {dtHeatPumpMan.Columns("HeatPumpManufacturerID_PK")}
If dtHeatPumpMan.Rows.Contains("0") Then
Else
drHeatPumpMan = dtHeatPumpMan.NewRow
drHeatPumpMan("HeatPumpManufacturerName") = " "
drHeatPumpMan("HeatPumpManufacturerID_PK") = "0"
dtHeatPumpMan.Rows.Add(drHeatPumpMan)
Dim vHeatPumpMan As DataView = dtHeatPumpMan.DefaultView
vHeatPumpMan.Sort = "HeatPumpManufacturerID_PK Asc"
dtHeatPumpMan = vHeatPumpMan.ToTable
End If
ddlManufacturer.DataSource = dtHeatPumpMan
Me.ddlManufacturer.DataTextField = "HeatPumpManufacturerName"
Me.ddlManufacturer.DataValueField = "HeatPumpManufacturerID_PK"
ddlManufacturer.DataBind()
lvHeatPumpModel.DataSource = HeatPumpSpec.GetHeatPumpMaint()
lvHeatPumpModel.DataBind()
Else
' Me.ddlManufacturer.SelectedValue = Session("HeatPumpManSelected")
End If
End Sub
Protected Sub ddlManufacturer_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ddlManufacturer.SelectedIndexChanged
Session("HeatPumpManSelected") = Me.ddlManufacturer.SelectedValue
lvHeatPumpModel.DataSource = HeatPumpSpec.GetHeatPumpMaint(Me.ddlManufacturer.SelectedValue)
lvHeatPumpModel.DataBind()
End Sub
Protected Sub lvHeatPumpModel_PagePropertiesChanging(sender As Object, e As PagePropertiesChangingEventArgs) Handles lvHeatPumpModel.PagePropertiesChanging
Dim pager As DataPager = TryCast(lvHeatPumpModel.FindControl("HeatPumpModelDataPager"), DataPager)
pager.SetPageProperties(1, 5, False)
End Sub
With this set-up I get the paging working on initial page load but that has always worked. The problem I have is that when an item is selected from the dropdown the program hits the database and loads only the records that meet the criteria and then rebinds the datasource. This gets me the records I need to see but if I'm on page 4 and the selection only covers page 1 I see an empty listview with the page navigation available for pages that don't exist.
If I step through in debug I now get a reference to the datapager but the SetPageProperties doesn't change any values. If I browse the pager instance of DataPager the querystringvalue is still 4 after the SetPageProperties runs. What do I need to do to get SetPageProperties to actually work?
Decker Dong ...
All-Star
118619 Points
18779 Posts
Re: Need dropdown selection to reset datapager to page 1 but datapager isn't found by dropdown co...
Jan 12, 2013 02:15 AM|LINK
Hi,
You can first try to find out the specific control out of LayoutTemplate, because I'm afraid you cannot find that control when in Layout Template:
<body> <form id="form1" runat="server"> <div> <asp:DataPager ID="dataPager" runat="server" PagedControlID="listItems" QueryStringField="page" PageSize="5"> <Fields> <asp:NumericPagerField /> Fields> asp:DataPager> <br /> <asp:ListView ID="listItems" runat="server" OnPagePropertiesChanging="listItems_PagePropertiesChanging"> ………………kraznodar
Contributor
3336 Points
889 Posts
Re: Need dropdown selection to reset datapager to page 1 but datapager isn't found by dropdown co...
Jan 14, 2013 03:10 PM|LINK
I'm marking this as answered because the first half of my question is answered. By moving the datapager out of the listview the code behind can now see it. I wasn't getting the functionality I wanted but when I tidied up the code I realized a line was commented out that shouldn't be. When I uncommented that it all worked.
This is how the code looks now:
<asp:DropDownList ID="ddlManufacturer" runat="server" AutoPostBack="true" onselectedindexchanged="ddlManufacturer_SelectedIndexChanged">
</asp:DropDownList>
<br />
<br />
<asp:DataPager runat="server" ID="HeatPumpModelDataPager" PageSize="5" PagedControlID="lvHeatPumpModel" QueryStringField="page">
<Fields>
<asp:NumericPagerField />
<asp:NextPreviousPagerField ShowFirstPageButton="True" ShowLastPageButton="True"
FirstPageText="|<< " LastPageText=" >>|" NextPageText=" > " PreviousPageText=" < " />
</Fields>
</asp:DataPager>
<asp:ListView ID="lvHeatPumpModel" DataKeyNames="ModelNumber_PK" runat="server" onitemediting="lvHeatPumpModel_ItemEditing" onitemupdating="lvHeatPumpModel_ItemUpdating" OnPagePropertiesChanging="lvHeatPumpModel_PagePropertiesChanging"
onitemcanceling="lvHeatPumpModel_ItemCanceling" onitemdeleting="lvHeatPumpModel_ItemDeleting" InsertItemPosition="LastItem" oniteminserting="lvHeatPumpModel_ItemInserting">
<LayoutTemplate>
<table style="width:800px; border:1 collapse black;" runat="server" id="tblHeatPumpModels">
<tr runat="server" id="itemPlaceholder" />
</table>
</LayoutTemplate>
<!-- rest of listview removed to save space on the post. -->
Protected Sub ddlManufacturer_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ddlManufacturer.SelectedIndexChanged
lvHeatPumpModel.DataSource = HeatPumpSpec.GetHeatPumpMaint(Me.ddlManufacturer.SelectedValue)
Session("HeatPumpManSelected") = Me.ddlManufacturer.SelectedValue
HeatPumpModelDataPager.SetPageProperties(0, 5, False)
lvHeatPumpModel.DataBind()
End Sub
Protected Sub lvHeatPumpModel_PagePropertiesChanging(sender As Object, e As PagePropertiesChangingEventArgs) Handles lvHeatPumpModel.PagePropertiesChanging
lvHeatPumpModel.DataBind() 'rebind List View
End Sub