画面にGridViewがあり、ページングを許可するために必要です。
マークアップ:
<asp:GridView ID="GridView1" runat="server" AllowPaging="True"
AutoGenerateColumns="False" DataSourceID="ObjectDataSource1">
<Columns>
<asp:BoundField DataField="appID" HeaderText="appID" SortExpression="appID" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="GetBookingId"
TypeName="AppointmentRepository">
<SelectParameters>
<asp:Parameter Name="maximumRows" Type="Int32" />
<asp:Parameter Name="startRowIndex" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
コードビハインド:
ObjectDataSource1.SelectParameters["maximumRows"].DefaultValue = "10";
ObjectDataSource1.SelectParameters["startRowIndex"].DefaultValue = "0";
LINQクエリ:
public IQueryable<tblAppointment> GetBookingId(int maximumRows, int startRowIndex)
{
var result = (FROM a IN dc.tblAppointments
SELECT a).Skip(startRowIndex).Take(maximumRows);
}
しかし、私はこのエラーを受け取ります:
データソースはサーバー側のデータページングをサポートしていません。
何が間違っていますか?
結果変数の単純なToList()
が機能するはずです。
編集:BornToCodeのように私の回答の下のコメントで説明されているように、エラーの理由はデータソースがICollectionを実装する必要があるためです。 IEnumerableは、ToList()
を実行すると、ICollectionを実装するリストに変換しません。
汎用List<T>
も使用できます。サンプルコードスニペットを参照してください。
public List<Company> GetContactList(int startindex)
{
string path = Server.MapPath("~/contacts.xml");
XDocument xd = XDocument.Load(path);
IEnumerable<Company> results = (from items in xd.Elements("Company").Elements("Contact")
select new Company
{
Id = items.Element("ID").Value,
Photo = (string)items.Element("photo").Value,
Name = (string)items.Element("Name").Value,
BloodGroup = (string)items.Element("Bg").Value,
Dob = (string)items.Element("dob").Value,
Anniversery = (string)items.Element("avd").Value,
Mobile = (string)items.Element("cnum").Value,
designation = (string)items.Element("desig").Value,
Team = (string)items.Element("team").Value
}).Skip(startindex*10).Take(10);
return (List<Company>) results;
}
DataReaderの代わりにDataSet/DataTableを使用することもできます。
.ToList()
DataSourceの最後に、私は以下のように割り当てられています:
gvCaseLabelsLeft.DataSource = caseLabelsList.OrderBy(c=>c.caseLabelNumber).ToList();
コードをこれに変更しました:
public List<string> ListofNewsTitle()
{
var query = from n in db.NewsEvents
orderby n.NewsDate descending
select n.NewsTitle;
return query.ToList();
}
この記事をお試しください https://www.aspsnippets.com/Articles/ASPNet-GridView-The-data-source-does-not-support-server-side-data-paging.aspx
要約すると、これらの行を使用してみてください
private void BindGrid()
{
string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand("SELECT CustomerId, ContactName, Country FROM Customers"))
{
cmd.Connection = con;
con.Open();
using (SqlDataReader sdr = cmd.ExecuteReader())
{
GridView1.DataSource = sdr;
GridView1.DataBind();
}
con.Close();
}
}
}
protected void OnPaging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
this.BindGrid();
}
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" AllowPaging="true"
OnPageIndexChanging="OnPaging">
<Columns>
<asp:BoundField DataField="CustomerID" HeaderText="CustomerID" />
<asp:BoundField DataField="ContactName" HeaderText="ContactName" />
<asp:BoundField DataField="Country" HeaderText="Country" />
</Columns>
ObjectDataSourceにenablePaging="true"
を追加するだけで機能します。
SqldataReaderを使用している場合、ページングはサポートされません。
このエラーの解決策は、Generic Listコレクション、DataTable、DataSetなどのDataSourcesを使用してGridViewをバインドすることです。
LINQクエリ:
ProductController.cs:
List<Product> products= productModel.GetProducts(start, offset);
ProductModel.cs:
public List<Product> GetProducts(int start, int offset)
{
IEnumerable<Product> query = from m in db.Products
orderby m.Id descending
select m;
query = query.Skip(start).Take(offset);
return query.ToList();
}