Hi - Regarding this...
sonu:
Here we go:
The webservice:
<WebMethod()> _
Public Function TestData(ByVal page As Integer, ByVal rowsPerPage As Integer) As DataTable
Dim dt As New DataTable("t1")
dt.Columns.Add("image")
dt.Columns.Add("title")
dt.Columns.Add("totalRows")
dt.Columns.Add("ID").AutoIncrement = True
For i As Integer = 0 To 100
dt.Rows.Add(New Object() {"img" & i.ToString, "title" & i.ToString, 100})
Next
Dim firstRec As Integer = (page - 1) * rowsPerPage
Dim lastRec As Integer = (page * rowsPerPage)
Dim dv As DataView = dt.DefaultView
dv.RowFilter = "ID >= " & firstRec & " AND ID <= " & lastRec
Dim filteredResult As DataTable = dv.ToTable
Return filteredResult
End Function
The aspx page:
<asp:ScriptManager runat="server" ID="sm1">
<Services>
<asp:ServiceReference Path="~/WebServices/Test/DataService.asmx" />
</Services>
</asp:ScriptManager>
Pager:
<AjaxData:Pager ID="pager" runat="server" ShowInfo="True"
PageIndex="1" PageSize="10" PageChangedEvent="OnPageChange"
ShowNumeric="true" ShowPreviousAndNext="True"/>
<AjaxData:DataList ID="ImagesList" runat="server" Visible=True ItemDataBoundEvent="onItemDataBound" >
<ItemTemplate>
<p id="spanPhoto"></p>
<p id="spanTitle"></p>
</ItemTemplate>
</AjaxData:DataList>
<script type="text/javascript">
var adc = null;
var pager = null;
var currentPage = 1;
var recsPerPage = 10;
function pageLoad(sender, e)
{
adc = $find('<%= ImagesList.ClientID %>');
pager = $find('<%= pager.ClientID %>');
BindData();
}
function BindData()
{
DataService.TestData(currentPage, recsPerPage, onLoadSuccess);
}
function onLoadSuccess(result)
{
var dt = result;
adc.set_dataSource(dt.rows);
adc.dataBind();
var totalRows = parseInt(dt.rows[0]["totalRows"]); // important - This needs to be an int!
pager.set_pageIndex(currentPage-1);
pager.set_recordCount(totalRows);
}
function OnPageChange(sender, e)
{
currentPage=e.get_newPageIndex()+1; // Set the global variable
// Rebind the data now
BindData();
}
function onItemDataBound(sender, e)
{
var item = e.get_item();
if (item.get_isDataItemType())
{
var row = item.get_dataItem();
var spanPhoto = item.findControl('spanPhoto');
var spanTitle = item.findControl('spanTitle');
setText(spanPhoto, row.image);
setText(spanTitle, row.title);
}
}
function setText(element, text)
{
if (typeof element.innerText != 'undefined')
{
element.innerText = text;
}
else if (typeof element.textContent != 'undefined')
{
element.textContent = text;
}
}
</script>
Let me know if this makes sense.
I've implemented it but there's two things...
First, on the screen when tested, I see "1 of NaN2345678" on the pager bit
Second, when I try to move beyond page 4, I get this error: "Microsoft JScript runtime error: 'rows.0' is null or not an object".
Here is the markup on the page...
<div>
<AjaxData:Pager ID="pager" runat="server" ShowInfo="True"
PageIndex="1" PageSize="10" PageChangedEvent="OnPageChange"
ShowNumeric="true" ShowPreviousAndNext="True"/>
<AjaxData:GridView ID="OverviewGrid" runat="server" Width="85%"
CellPadding="3" RowDataBoundEvent="OnRowDataBound" >
<Columns>
<AjaxData:GridViewTemplateColumn HeaderText="Properties" ColumnID="1">
<ItemTemplate>
<div>
<div style="width:22%; float:left;">
<img src='' alt='' id="img1" class="ovgridimage"/>
</div>
<div style="width:78%">
<span id="spnHeader" class="ovgridheader"></span><br class="br5" />
<span id="spnPara1" class="ovgridpara1"></span> <br class="br5" />
</div>
<br class="br5" /><br class="br5" /><br class="br5" /><br class="br5" />
</div>
<div style="float:none; width:100%;">
<br class="br5" />
<br class="brx1" />
<hr class="propertysepz" />
</div>
</ItemTemplate>
<HeaderStyle CssClass="ovgridheaderstyle" />
<ItemStyle CssClass="ovgridimagecol" />
</AjaxData:GridViewTemplateColumn>
</Columns>
</AjaxData:GridView>
</div>
<script type="text/javascript">
var gridView = null;
var adc = null; // data control reference (not used)
var pager = null; // var use for reference to pager control
var currentPage = 1;
var recsPerPage = 10;
function pageLoad(sender, e)
{
// get references to page objects (gridView and pager)
gridView = $find('<%= OverviewGrid.ClientID %>');
pager = $find('<%= pager.ClientID %>');
// Bind the data
BindData();
}
function BindData()
{
// invoke the webservice call
// pass in current page, records per page, and function
DataService.GetAllPropertiesPaged(currentPage, recsPerPage, onLoadSuccess);
}
function onLoadSuccess(result)
{
var dt = result; //store result in variable
gridView.set_dataSource(dt.rows);
gridView.dataBind();
// important - This needs to be an int! :
var totalRows = parseInt(dt.rows[0]["totalRows"]);
pager.set_pageIndex(currentPage-1);
pager.set_recordCount(totalRows);
}
function OnPageChange(sender, e)
{
currentPage=e.get_newPageIndex()+1; // Set the global variable
// Rebind the data now
BindData();
}
function OnRowDataBound(sender, e)
{
if (e.get_row().get_isDataRowType())
{
var row=e.get_row();
var item = row.get_dataItem();
var control = row.findControl("img1");
control.src = item.image1thumb;
var spnHeader = row.findControl('spnHeader');
var spnPara1 = row.findControl('spnPara1');
// set the text - You could also do this:
// setText(spn, "Hello World!!!");
// setText(spn, item.headerbullet1);
setText(spnHeader, item.header);
setText(spnPara1, item.para1);
}
}
function setText(element, text)
{
if (typeof element.textContent != 'undefined')
{
element.textContent = text;
}
else if (typeof element.innerText != 'undefined')
{
element.innerText = text;
}
}
</script>
And this is the web service method (c#):
[WebMethod()]
public DataTable GetAllPropertiesPaged(int page, int rowsPerPage)
{
DataTable myTable = null;
DataTable newTable = null;
try
{
// get all data
myTable = Properties.GetAllPropertiesForWebService();
// returning paged data
//
newTable = new System.Data.DataTable("properties");
System.Data.DataColumn column = new DataColumn();
column.DataType = System.Type.GetType("System.Int32");
column.AutoIncrement = true;
column.ColumnName = "iID";
column.ReadOnly = true;
column.Unique = true;
column.AutoIncrementSeed = 1;
column.AutoIncrementStep = 1;
// Add the Column to the DataColumnCollection.
newTable.Columns.Add(column);
// next column
column = new DataColumn();
column.DataType = System.Type.GetType("System.String");
column.ColumnName = "header";
column.AutoIncrement = false;
column.Caption = "header";
column.ReadOnly = false;
column.Unique = false;
// Add the column to the table.
newTable.Columns.Add(column);
// next column
column = new DataColumn();
column.DataType = System.Type.GetType("System.String");
column.ColumnName = "para1";
column.AutoIncrement = false;
column.Caption = "para1";
column.ReadOnly = false;
column.Unique = false;
// Add the column to the table.
newTable.Columns.Add(column);
// next column
column = new DataColumn();
column.DataType = System.Type.GetType("System.String");
column.ColumnName = "image1thumb";
column.AutoIncrement = false;
column.Caption = "image1thumb";
column.ReadOnly = false;
column.Unique = false;
// Add the column to the table.
newTable.Columns.Add(column);
// add data to new table
int tot = myTable.Rows.Count;
for (int i = 0; i < tot; i++)
{
System.Data.DataRow row = newTable.NewRow();
//row["iID"] = i;
row["header"] = myTable.Rows
.ItemArray[25];
row["para1"] = myTable.Rows
.ItemArray[19];
row["image1thumb"] = myTable.Rows
.ItemArray[47];
newTable.Rows.Add(row);
}
// Should have new table with linear unique ID at this point
// Now paged data...
int FromID = ((page - 1) * rowsPerPage) + 0;
int ToID = page * rowsPerPage + 0;
DataView dv = newTable.DefaultView;
dv.RowFilter = "iID >= " + FromID + " AND iID <= " + ToID;
DataTable filteredResult = dv.ToTable();
return filteredResult;
}
catch (Exception ex)
{
// throw ex;
return newTable;
}
}
Have I implemented this right or done something wrong!??
Any help appreciated.
Thanks,
Darren