C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: GridView最終ページでポストバック時に余計な行が表示


(過去ログ 124 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■74111 / inTopicNo.1)  GridView最終ページでポストバック時に余計な行が表示
  
□投稿者/ めるぽん (1回)-(2014/12/01(Mon) 13:58:44)

分類:[.NET 全般] 

2014/12/01(Mon) 14:13:39 編集(投稿者)

タイトルが入りきらなかったため再掲します
タイトル「GridView最終ページでポストバック時に余計な行が表示される」


こんにちは、C#.net , .netFramework4.5 , IE8で開発をしています。

GridViewの最終ページにて最大行数表示されていない状態(例:GridViewの1ページの最大件数を10行設定、データ件数15件の2ページ目)にて
GridView内のアイテムでポストバックをした際に、余計な空白行が出力されてしまうのですが、どういった理由なのかお分かりの方、ご教示いただけますでしょうか。

よろしくお願いします。

以下ソースです。

--GridPagerTest.aspx--

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GridPagerTest.aspx.cs" Inherits="GridTest.GridPagerTest" EnableEventValidation="false"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridTest" runat="server" AutoGenerateColumns="False" AllowPaging="true"
AllowCustomPaging="true" OnPageIndexChanging = "searchResults_PageIndexChanging" >
<PagerSettings Position="TopAndBottom" Visible="true" />
<Columns>
<asp:BoundField HeaderText="No" DataField="No" />
<asp:TemplateField HeaderText="ボタン列">
<ItemTemplate>
<asp:Button ID="btnTest" runat="server" Width="50px" CausesValidation="false" CommandName="Button" Text="Test" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="名前" DataField="Name" />
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>


--GridPagerTest.aspx.cs--

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Reflection;
using System.Linq.Expressions;


namespace GridTest
{
public partial class GridPagerTest : System.Web.UI.Page
{
private const int dispCount = 10;

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataTable table = GetDataSource();
this.GridTest.VirtualItemCount = table.Rows.Count;
this.GridTest.PageIndex = 0;
this.GridTest.PageSize = dispCount;
this.GridTest.DataSource = table;
this.GridTest.DataBind();

}
}




#region GridView PageIndexChangingイベント
/// <summary>
/// GridView PageIndexChangingイベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void searchResults_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
DataTable table = GetDataSource();
int iTableCount = table.Rows.Count;
table = table.AsEnumerable().Skip(e.NewPageIndex * dispCount).Take(dispCount).CopyToDataTable();
this.GridTest.VirtualItemCount = iTableCount;
this.GridTest.PageIndex = e.NewPageIndex;
this.GridTest.PageSize = dispCount;

//this.GridTest.PageSize = table.Rows.Count;

this.GridTest.DataSource = table;
this.GridTest.DataBind();
}
#endregion

public DataTable GetDataSource() {
DataTable table = new DataTable();
table.Columns.Add("No");
table.Columns.Add("Name");

for (int i = 1; i < 15; i++)
{
DataRow row = table.NewRow();
row["No"] = i;
row["Name"] = "aaaa";
table.Rows.Add(row);
}

return table;
}


}
}
引用返信 編集キー/
■74120 / inTopicNo.2)  Re[1]: GridView最終ページでポストバック時に余計な行が表示
□投稿者/ WebSurfer (408回)-(2014/12/01(Mon) 19:01:15)
No74111 (めるぽん さん) に返信

> GridView内のアイテムでポストバックをした際に、余計な空白行が出力されてしまうのですが、

意味が分かりません。(詳しくコードを読めばわかるとは言わないでくださいね。まず十分な説
明があって、コードはそれを捕捉する意味で必要最低限に留めていただければと思います)

「アイテム」とは何ですか? 「アイテム」をユーザーがどうするとポストバックするのですか?
ポストバックするとどうなるのですか? 「余計な空白行」とは具体的にどういうものですか?

データソースコントロール(SqlDataSource や ObjectDataSource)と GridView を組み合わせ
使ってはいかがでしょう。そうすば、ページングに関する問題(空白行ができるというのも含め
て)は起こらないはずですし、ほとんど一行も自力でコードを書かずにページングを実装できま
す。

データソースコントロールが使えない理由があれば教えてください。何か代案が出せるかもしれ
ませんので。

引用返信 編集キー/
■74164 / inTopicNo.3)  Re[2]: GridView最終ページでポストバック時に余計な行が表示
□投稿者/ 車ほしい (1回)-(2014/12/04(Thu) 11:31:20)
No74111 (めるぽん さん) に返信

GridViewに空白が表示されるのは、空白のデータがバインドされているからでは?

> table = table.AsEnumerable().Skip(e.NewPageIndex * dispCount).Take(dispCount).CopyToDataTable();
> this.GridTest.VirtualItemCount = iTableCount;

そもそもGridViewのページングで↑のような処理は要らないんじゃないかと。

引用返信 編集キー/
■74170 / inTopicNo.4)  Re[1]: GridView最終ページでポストバック時に余計な行が表示
□投稿者/ WebSurfer (411回)-(2014/12/04(Thu) 18:04:30)
No74111 (めるぽん さん) に返信

今頃になって何ですが、コードを見ると、ASP.NET 4.5 GridView の新機能カスタム
ページングを利用したいということのようですね。

そのために、

table = table.AsEnumerable().Skip(e.NewPageIndex * dispCount).Take(dispCount).CopyToDataTable();

としていると思いますが、「余計な行が表示される」という問題の原因はそこにある
ようです。デバッガで table の中身を見てください。多分最終ベージでも 10 行 あ
って内 6 行はカラではないですか。

どうしてそのようなやり方をしているのか分かりませんが、単に試験的にカスタムペ
ージングの機能を見ているだけだとしても、やり方が変だと思います。

カスタムページングの設定方法については以下の記事が参考になりませんか? この
ようにすれば「余計な行が表示される」ということはないはずです。

Custom Paging With GridView in ASP.NET 4.5
http://www.c-sharpcorner.com/UploadFile/99bb20/custom-paging-with-gridview-control-in-Asp-Net-4-5/

ちなみに、同等なページングの機能は、ASP.NET 4.5 まで待たなくても、ASP.NET 2.0
から利用できる ObjectDataSource で実現できます。ご参考まで。

ObjectDataSource でページング
http://surferonwww.info/BlogEngine/post/2010/08/26/Paging-with-ObjectDataSource.aspx

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -