2017-11-14 1 views
0

그 표준의 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에서 현재 볼 수있는 데이터를 변경하고, 그러나 그없이 데이터 세트를 단축하는 것 아마 무엇인가 이해?

여기에 뭔가가 빠졌습니다. 이게 뭐야? 데이터를 잃지 않고이 그리드 뷰 페이징을 얻으려면 어떻게해야합니까?

+0

gvAlerts.PageIndex = e.NewPageIndex; 당신이 필요로하는 것이 전부라면, 건너 뛰기 나 가져갈 필요가 없습니다. – InitLipton

+0

@InitLipton은 gridview에서 페이지를 변경하지만 데이터는 변경되지 않습니다. – Ortund

답변

1

GridVI의 단점은 모든 레코드가 매번 검색되고 /거나 ViewState에 모두 저장된다는 것입니다. 그래서 Linq를 사용하여 자신 만의 페이징 방법을 만들고 싶다면. 이것이 어떻게 행해질 수 있는지에 대한 간단한 예제 아래에 있습니다. 여전히 빌드 - 페이징을 사용하려면, InitLipton

List<Book> books; 
int pageSize = 10; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    //fill the collection 
    books = fillBooks(); 

    //create the dynamic pager buttons, this needs to be done on every page load 
    createPager(); 

    //bind the grid for the first time without postback 
    if (!IsPostBack) 
    { 
     bindGrid(0); 
    } 
} 


private void bindGrid(int offSet) 
{ 
    //bind the right amount of items to the grid 
    GridView1.DataSource = books.Skip(offSet).Take(pageSize).ToList(); 
    GridView1.DataBind(); 
} 


private void createPager() 
{ 
    //loop for every x items in the collection 
    for (int i = 0; i < (books.Count/pageSize); i++) 
    { 
     //create a linkbutton 
     LinkButton lb = new LinkButton(); 

     //add the properties 
     lb.Text = (i + 1).ToString(); 
     lb.CommandArgument = i.ToString(); 

     //bind the command method 
     lb.Command += Lb_Command; 

     //add the linkbutton to the page 
     PlaceHolder1.Controls.Add(lb); 

     //add some spacing 
     PlaceHolder1.Controls.Add(new Literal() { Text = "&nbsp;" }); 
    } 
} 


private void Lb_Command(object sender, CommandEventArgs e) 
{ 
    //rebind the grid with the next 10 items 
    bindGrid(Convert.ToInt32(e.CommandArgument) * 10); 
} 

의 의견과 영문을 따라

<asp:GridView ID="GridView1" runat="server" EnableViewState="false"></asp:GridView> 
<br /> 
<br /> 
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder> 
관련 문제