2011-10-28 24 views
0

これまでどこからでも見てきました。 D:ここに私の問題があります:C#、Prev/Nextを使用したページングデータグリッドデータは機能しません

私はDataGridTemplateItemsを持っていますが、ボタンをクリックした後にデータが入力される2つの数字が入ります。私のボタンには2つの日付があり、ユーザーは2つのTextBoxesに参加し、それらの日付の間のすべてのエントリをDataBaseから引き出します。エントリはDataGridに表示されます。私が必要とするのはDataGridです。ページあたり10行のページングが可能です。私が必要とするのは、です。です。前へデータを含むページを通るリンク。リンクは機能しますが、データは変更されません(次はは次のページには移動しません)。私は、ある特定の日付の間にItemsのための10以上のエントリーがあるという事実を知っているので、私はデータがそれがどんなページに基づいて変わるべきか知っています。また、次のボタンは無限であるようです。どうして?誰か、助けてください。

何らかの理由でデータベースからデータを取得すると、すべてのエントリを取得することから始まりますが、その後は10個しか格納されません(これは、ページを一度に表示する量です)。データは決してそこに残っていることを示していません...なぜ? D ':

+1

の後ろ、あなたの質問に答えた場合、ここで答えを投稿してくださいし、他の人はそれが解決されます知っているように、それを受け入れます。 – jwiscarson

答えて

0

同僚のだから、一つはこの1で私を助けてしまいました。はい!これは私のページングDataGridの最終結果です。このコードはすべて、データベースから取り出されたアイテムの数を取得し、VirtualItemCount(表示するページ数を設定する)を設定し、データをページングすることを可能にしました。 AllDataSourcesは、グリッドの設定で動作するようにデータベースからデータを取得する別のクラスであり、CamSizerDataは、すべてのデータを含むTableの名前であり、Countを取得するために使用されます。他にご質問がありましたら、お気軽にお問い合わせください。:)

DataGridの

<asp:DataGrid ID="dgArchive" CssClass="data" AutoGenerateColumns="False" runat="server" 
    AllowPaging="True" AllowCustomPaging="True" Visible="False" OnPageIndexChanged="dgArchive_PageIndexChanged"> 
    <Columns> 
     <asp:TemplateColumn HeaderStyle-CssClass="infoHeaderDG" ItemStyle-CssClass="line"> 
      <HeaderTemplate> 
       Line</HeaderTemplate> 
      <ItemTemplate> 
       <asp:Label ID="LineNumber" Text='<%# DataBinder.Eval(Container.DataItem, "LineNumber") %>' 
        runat="server" /></ItemTemplate> 
      <HeaderStyle CssClass="infoHeaderDG"></HeaderStyle> 
      <ItemStyle CssClass="line"></ItemStyle> 
     </asp:TemplateColumn> 
     <asp:TemplateColumn HeaderStyle-CssClass="infoHeaderDG" ItemStyle-CssClass="date"> 
      <HeaderTemplate> 
       Date</HeaderTemplate> 
      <ItemTemplate> 
       <asp:Label ID="CreateDate" Text='<%# DataBinder.Eval(Container.DataItem, "CreateDate", "{0: MM/dd/yyyy}") %>' 
        runat="server" /></ItemTemplate> 
      <HeaderStyle CssClass="infoHeaderDG"></HeaderStyle> 
      <ItemStyle CssClass="date"></ItemStyle> 
     </asp:TemplateColumn> 
     <asp:TemplateColumn HeaderStyle-CssClass="infoHeaderDG" ItemStyle-CssClass="operator"> 
      <HeaderTemplate> 
       Operator</HeaderTemplate> 
      <ItemTemplate> 
       <asp:Label ID="Operator" Text='<%# DataBinder.Eval(Container.DataItem, "Operator") %>' 
        runat="server" /></ItemTemplate> 
      <HeaderStyle CssClass="infoHeaderDG"></HeaderStyle> 
      <ItemStyle CssClass="operator"></ItemStyle> 
     </asp:TemplateColumn> 
     <asp:TemplateColumn HeaderStyle-CssClass="infoHeaderDG" ItemStyle-CssClass="product"> 
      <HeaderTemplate> 
       Product</HeaderTemplate> 
      <ItemTemplate> 
       <asp:Label ID="Product" Text='<%# DataBinder.Eval(Container.DataItem, "ProdNumber") %>' runat="server" /></ItemTemplate> 
      <HeaderStyle CssClass="infoHeaderDG"></HeaderStyle> 
      <ItemStyle CssClass="product"></ItemStyle> 
     </asp:TemplateColumn> 
    </Columns> 
    <PagerStyle Mode="NumericPages" PageButtonCount="5" /> 
</asp:DataGrid> 

コード

protected void Page_Load(object sender, EventArgs e) 
    { 
     Page.MaintainScrollPositionOnPostBack = true; 
    } 

    protected void GetDateEntries_Click(object sender, EventArgs e) 
    { 
     dgArchive.Visible = true; 
     using (Entities ent = new Entities(ConfigurationManager.ConnectionStrings["QCConnString"].ToString())) 
     { 
      DateTime start = Convert.ToDateTime(Start.Text); 
      DateTime end = Convert.ToDateTime(End.Text).AddDays(1); 
      AllDataSources ds = new AllDataSources(); 
      CamsizerData cd = new CamsizerData(); 
      IEnumerable<CamsizerData> led = cd.GetBySelectedDates(ent, start, end); 
      int counter = led.Count(); 
      dgArchive.VirtualItemCount = counter; 

      dgArchive.DataSource = ds.populateArchive(ent, start, end); 
      dgArchive.DataBind(); 
     } 
    } 

    protected void dgArchive_PageIndexChanged(object source, DataGridPageChangedEventArgs e) 
    { 
     if (source != null) 
     {     
      dgArchive.CurrentPageIndex = e.NewPageIndex; 
      Entities ent = new Entities(ConfigurationManager.ConnectionStrings["QCConnString"].ToString()); 
      DateTime start = Convert.ToDateTime(Start.Text); 
      DateTime end = Convert.ToDateTime(End.Text).AddDays(1); 
      AllDataSources ds = new AllDataSources(); 

      IEnumerable<object> recs = ds.populateArchive(ent, start, end); 
      dgArchive.DataSource = recs.Skip(10 * e.NewPageIndex); 
      dgArchive.DataBind(); 
     } 
    } 
1

データソースを設定する前に新しいページインデックスを設定します。

protected void dgArchive_PageIndexChanged(object source, DataGridPageChangedEventArgs e) 
{ 

    if (source != null) 
    { 
     dgArchive.CurrentPageIndex = e.NewPageIndex; 
     JSP_Extrusion_QCEntities ent = new JSP_Extrusion_QCEntities(ConfigurationManager.ConnectionStrings["QCConnString"].ToString()); 
     DateTime start = Convert.ToDateTime(Start.Text); 
     DateTime end = Convert.ToDateTime(End.Text).AddDays(1); 
     AllDataSources ds = new AllDataSources(); 

     dgArchive.DataSource = ds.populateArchive(ent, start, end); 
     dgArchive.DataBind(); 

    } 
} 

また、なぜあなたのイベントをPage_Loadに接続しますか?あなたがマークアップでそれをするなら、あなたはそれをする必要はありません。

これら3行:

GetDateEntries.Click += new EventHandler(GetDateEntries_Click); 
    dgArchive.VirtualItemCount = 200; 
    dgArchive.PageIndexChanged += new DataGridPageChangedEventHandler(dgArchive_PageIndexChanged); 

は、マークアップで宣言する必要があります。マークアップからグリッドのPageIndexChangedに登録する方法は次のとおりです。

<asp:DataGrid ID="dgArchive" CssClass="data" AutoGenerateColumns="False" runat="server" AllowPaging="true" 
PageSize="10" EnableViewState="true" AllowCustomPaging="true" Visible="false" 
OnPageIndexChanged="dgArchive_PageIndexChanged" 
> 

Here's an example from MSDN.

+0

+1: 'populateArchive'は何をしますか?これは、ページ範囲のパラメータを使用してデータベースにクエリを実行するのですか、それともフィルタリングするだけですか? ? –

+0

@JamesJohnson dunno;私は彼のコードから取り出した。 DataGridをカスタムオブジェクト(AllDataSources)にバインドしているように見え、 'populateArchive'はデータを返すメソッドです。 – Icarus

+0

Page_Loadに設定した場合、またはマークアップに配置した場合は、実際には関係ありません。まだどちらかの方法で動作します。 Page_Loadでは、何が何で、何がどこにあるかを見ることができます。 しかし、それが変更されたかどうかを確認するために変更しました。私はもう一度チェックし、データが移入されたときに、PageSizeが何であってもデータが移入されるように見えます。 "dateA"と "dateB"の間には28個の項目がありますが、最初の10個だけが表示されます。それらは*次へ*ボタンで変更されません。 :/ – SiSan

0

あなたはグリッドにあなたがページを変更するたびに再バインドする必要があります。ここにあなたが何をする必要があるかについて概説例です:

<asp:DataGrid ID="DataGrid1" runat="server" OnPageIndexChanged="DataGrid1_PageIndexChange" ...> 

コードビハインド:

protected void DataGrid1_PageIndexChange(object sender, DataGridPageChangedEventArgs e) 
{ 
    DataGrid1.CurrentPageIndex = e.NewPageIndex; 
    BindDataGrid(); 
} 

private void BindDataGrid() 
{ 
    DataGrid1.DataSource = GetSomeData(); 
    DataGrid1.DataBind(); 

    int total = dt.Rows.Count; 
    int pSize = grdJobs.PageSize; 
    int pIndex = grdJobs.CurrentPageIndex; 

    if (total < pSize) 
     pSize = total; 

    int start = (pSize * pIndex) + 1; 
    int end = (start + pSize) - 1; 

    if (end > total) 
     end = total; 

    lblTotalResults.Text = String.Format("Displaying {0}-{1} Of {2}", start, end, total);   
} 
+0

James、BindDataGridの最初の 'if'の' dt'は何ですか? – Icarus

+0

グリッドにバインドされた 'DataTable'でしたが、例を単純化して削除するのを忘れました。それは今行ってしまった。 –

関連する問題