그 표준의 gridview : 바로하지만 작업 페이징을받을 수없는 것ASP 그리드 뷰에서 페이지를 열면 왜 데이터 세트가 짧아 집니까?
<asp:GridView runat="server" ID="gvAlerts" AutoGenerateColumns="false"
DataKeyNames="Id" CssClass="table table-striped table-bordered table-hover"
OnRowDataBound="gvAlerts_RowDataBound"
OnSelectedIndexChanging="gvAlerts_SelectedIndexChanging"
OnRowDeleting="gvAlerts_RowDeleting"
EmptyDataText="There are no alerts to manage."
PageSize="10" AllowPaging="true"
PagerSettings-Position="TopAndBottom"
PagerSettings-Visible="true"
PagerSettings-Mode="NumericFirstLast"
OnPageIndexChanging="gvAlerts_PageIndexChanging">
<Columns>
<asp:BoundField HeaderText="" DataField="ContractEntity"
SortExpression="Supplier" />
<asp:BoundField HeaderText="Reference" DataField="Reference"
SortExpression="Reference" />
<asp:BoundField HeaderText="Date" DataField="Date"
SortExpression="Date" DataFormatString="{0:dd/MM/yyyy}" />
<asp:BoundField HeaderText="Contact Person" DataField="Username"
SortExpression="Username" />
<asp:BoundField HeaderText="End Date" DataField="EndDate"
SortExpression="EndDate" DataFormatString="{0:dd/MM/yyyy}" />
<asp:BoundField HeaderText="Value" DataField="Value"
SortExpression="Value" DataFormatString="R{0:# ### ###.00}" />
<asp:BoundField HeaderText="Category" DataField="ContractCategory"
SortExpression="Category" />
<asp:CommandField ShowSelectButton="true" SelectText="<i class='glyphicon glyphicon-pencil'></i>" />
<asp:CommandField ShowDeleteButton="true" DeleteText="<i class='glyphicon glyphicon-trash'></i>" />
</Columns>
</asp:GridView>
.
아래 코드에서 데이터를 테스트 용으로 80 개 레코드로 제한했습니다. 그것은 다른 페이지로 갈 때 데이터가 실제로 넘겨받는 것처럼 보입니다. 그러나 그것이 전부는 아닙니다. 그리드 뷰에 바인딩 할 레코드가 충분하지 않기 때문에 페이징이 더 이상 가능하지 않을 때까지 매번 반환되는 데이터가 항상 적습니다.
private List<Alert> _alerts { get; set; }
protected void gvAlerts_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
gvAlerts.PageIndex = e.NewPageIndex;
try
{
PageData(e.NewPageIndex);
}
catch (ArgumentNullException ane)
{
// Get all Alerts data again since the collection was apparently
// emptied on postback.
_alerts = GetAlerts();
PageData(e.NewPageIndex);
}
}
private void PageData(int pageIndex)
{
List<Alert> alerts = _alerts;
if (pageIndex >= 2)
{
alerts = _alerts.Skip(pageIndex * gvAlerts.PageSize).Take(gvAlerts.PageSize).ToList();
}
gvAlerts.DataSource = BuildGridViewModel(alerts);
gvAlerts.DataBind();
}
private List<AlertListViewModel> BuildGridViewModel(List<Alert> alerts)
{
var model = new List<AlertListViewModel>();
var u = HttpContext.Current.User.Identity;
using (var db = new ApplicationDbContext())
{
foreach (Alert alert in alerts)
{
// Due to poor database design, these queries are unavoidable.
var contract = db.Contracts.FirstOrDefault(x => x.Id == alert.ContractId);
var category = db.Categories.FirstOrDefault(x => x.Id == contract.CategoryId).Name;
var entity = db.ContractEntities.FirstOrDefault(x => x.Id == contract.ContractEntityId).Name;
model.Add(new AlertListViewModel
{
// Map model properties.
});
}
}
return model;
}
은 내가 .Skip()
및 .Take()
가 어떻게이있는 gridview에서 현재 볼 수있는 데이터를 변경하고, 그러나 그없이 데이터 세트를 단축하는 것 아마 무엇인가 이해?
여기에 뭔가가 빠졌습니다. 이게 뭐야? 데이터를 잃지 않고이 그리드 뷰 페이징을 얻으려면 어떻게해야합니까?
gvAlerts.PageIndex = e.NewPageIndex; 당신이 필요로하는 것이 전부라면, 건너 뛰기 나 가져갈 필요가 없습니다. – InitLipton
@InitLipton은 gridview에서 페이지를 변경하지만 데이터는 변경되지 않습니다. – Ortund