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

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

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

Re[11]: ASP.NETのListViewで空行表示の方法


(過去ログ 93 を表示中)

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

■55564 / inTopicNo.1)  ASP.NETのListViewで空行表示の方法
  
□投稿者/ Aco (1回)-(2010/12/06(Mon) 14:25:31)

分類:[ASP.NET (C#)] 

お世話になります。

ASP.NETのListViewコントロールで、
たとえば、3列×2行で並べてデータを表示する場合で
表示データが3つしかない場合、通常ですと、
3つのデータが画面中央寄せで表示されます。

しかし、データ数でデザインが異なるのを防ぐために
データがない場合でも2行目は空で表示させたいのです。

列数が足りない場合は<EmptyItemTamplate>の内容が表示されますが、
行自体が足りない場合はこれが適用されません。

ListViewに、このような場合に対処する設定はあるのでしょうか。
独自でコード上で行わなければならないのでしょうか。

ご存知の方いらっしゃれば、ご教授お願いいたします。
引用返信 編集キー/
■55583 / inTopicNo.2)  Re[1]: ASP.NETのListViewで空行表示の方法
□投稿者/ じゃんぬねっと (16回)-(2010/12/07(Tue) 01:16:58)
No55564 (Aco さん) に返信
> ListViewに、このような場合に対処する設定はあるのでしょうか。
> 独自でコード上で行わなければならないのでしょうか。

ListView 鯖コントロールにどうやって DataSource を適用しているかわかりませんが、バウンド / アンバウンド、どちらでも有効なのは空の DataRow を用意することでしょう。
引用返信 編集キー/
■55590 / inTopicNo.3)  Re[2]: ASP.NETのListViewで空行表示の方法
□投稿者/ Aco (2回)-(2010/12/07(Tue) 10:12:08)
No55583 (じゃんぬねっと さん) に返信
> ■No55564 (Aco さん) に返信
>>ListViewに、このような場合に対処する設定はあるのでしょうか。
>>独自でコード上で行わなければならないのでしょうか。
>
> ListView 鯖コントロールにどうやって DataSource を適用しているかわかりませんが、バウンド / アンバウンド、どちらでも有効なのは空の DataRow を用意することでしょう。

回答ありがとうございます。

ObjectDataSourceにて、TableAdapterのGetDataでバウンドして表示しています。
行が足りない場合、バウンドもとのデータに空の行を手動で追加するということでしょうか。。。
引用返信 編集キー/
■55642 / inTopicNo.4)  Re[3]: ASP.NETのListViewで空行表示の方法
□投稿者/ もりお (307回)-(2010/12/08(Wed) 09:47:43)
No55590 (Aco さん) に返信

> 行が足りない場合、バウンドもとのデータに空の行を手動で追加するということでしょうか。。。

はい。データが ObjectDataSource に渡る前、TableAdapter の GetData メソッドを
書き換えて空のデータを追加するようにしたり、またはデータベースに空のデータを入れておく
という手もあります。

ところで、ListView の 3 列 × 2 行はどのようにして実現しているのでしょうか。
ItemTemplate にて 2 行を作成しておけば、データが 3 つであっても 2 行で出力できるかと
思います。

<asp:ListView ID="ListView1" runat="server" DataSourceID="ObjectDataSource1">
  <LayoutTemplate>
    <asp:PlaceHolder ID="itemPlaceHolder" runat="server"></asp:PlaceHolder>
  </LayoutTemplate>
  <ItemTemplate>
    <table>
      <tr>
        <td><asp:Label ID="column1Label" runat="server" Text='<%# Eval("column1") %>'></asp:Label></td>
        <td><asp:Label ID="column2Label" runat="server" Text='<%# Eval("column2") %>'></asp:Label></td>
        <td><asp:Label ID="column3Label" runat="server" Text='<%# Eval("column3") %>'></asp:Label></td>
      </tr>
      <tr>
        <td><asp:Label ID="column4Label" runat="server" Text='<%# Eval("column4") %>'></asp:Label></td>
        <td><asp:Label ID="column5Label" runat="server" Text='<%# Eval("column5") %>'></asp:Label></td>
        <td><asp:Label ID="column6Label" runat="server" Text='<%# Eval("column6") %>'></asp:Label></td>
      </tr>
    </table>
  </ItemTemplate>
</asp:ListView>

引用返信 編集キー/
■55659 / inTopicNo.5)  Re[4]: ASP.NETのListViewで空行表示の方法
□投稿者/ Aco (3回)-(2010/12/08(Wed) 14:08:00)
回答ありがとうございます。

No55642 (もりお さん) に返信

> ところで、ListView の 3 列 × 2 行はどのようにして実現しているのでしょうか。

ListViewのGroupItemCountを3、ListViewに紐付けたDataPagerのPageSizeを6にして
3列×2行にしております。
もりお様が提示されたソースのようにセルの中を複数行にするのではなく、
この複数行のテーブルを含んだセルを常に(データ数にかかわらず)
複数行(ここでは2行)にしたいです。

ListViewにEmptyRowTempleteのようなものや、常に行数を固定にする的な
プロパティがないかなぁ、と思ったのでした。

バウンド元のデータに空行を追加するほうがスマートかと思いますが
ListViewに直接行追加することは可能なのでしょうか。
引用返信 編集キー/
■55667 / inTopicNo.6)  Re[5]: ASP.NETのListViewで空行表示の方法
□投稿者/ もりお (308回)-(2010/12/08(Wed) 19:27:10)
2010/12/08(Wed) 21:41:43 編集(投稿者)
ListView.DataBound イベントを ListView.PreRender イベントに修正しました。

■No55659 (Aco さん) に返信

> ListViewにEmptyRowTempleteのようなものや、常に行数を固定にする的な 
> プロパティがないかなぁ、と思ったのでした。 

そういうことでしたか。遅まきながらわかりました。
行数を指定するようなプロパティは ListView にはなさそうですね。
ListView は、EmptyItemTemplate を適用する際に、GroupItemCount プロパティのみ参照
して、行数といいますか DataPager の PageSize プロパティを参照しないみたいですね。

> バウンド元のデータに空行を追加するほうがスマートかと思いますが 
> ListViewに直接行追加することは可能なのでしょうか。 

LayoutTemplate に EmptyRow 用の PlaceHolder コントロールを配置して、
ListView.PreRender イベントでコントロールを追加してはいかがでしょうか。

[WebForm.aspx]

<asp:ListView ID="ListView1" runat="server" DataSourceID="ObjectDataSource1" 
    GroupItemCount="3" onprerender="ListView1_PreRender">
  <LayoutTemplate>
    <table>
      <asp:PlaceHolder ID="groupPlaceHolder" runat="server"></asp:PlaceHolder>
      <asp:PlaceHolder ID="emptyRowPlaceHolder" runat="server"></asp:PlaceHolder>
    </table>
  <LayoutTemplate>

[WebForm.aspx.cs]

protected void ListView1_PreRender(object sender, EventArgs e) {
  if (this.ListView1.Items.Count < 4) {
    PlaceHolder emptyRowPlaceHolder = (PlaceHolder)this.ListView1.FindControl("emptyRowPlaceHolder");
    emptyRowPlaceHolder.Controls.Add(this.createEmptyRow());
  }
}

protected Control createEmptyRow() {
  Container groupContainer = new Container();
  this.ListView1.GroupTemplate.InstantiateIn(groupContainer);
  Control itemPlaceholder = groupContainer.FindControl(this.ListView1.ItemPlaceholderID);
  for (Int32 i = 0; i < this.ListView1.GroupItemCount; i++) {
    Control itemContainer = new Container();
    this.ListView1.EmptyItemTemplate.InstantiateIn(itemContainer);
    itemPlaceholder.Controls.Add(itemContainer);
  }
  return groupContainer;
}

class Container : Control, INamingContainer {
}


4 というマジックナンバーが気になって仕方がありません。

引用返信 編集キー/
■55670 / inTopicNo.7)  Re[6]: ASP.NETのListViewで空行表示の方法
□投稿者/ MM (1回)-(2010/12/09(Thu) 00:24:21)
行数が足りない時、空行を追加すればいいのでは?
空行はnullが挿入されるので、null対策も必要かと
Dim tRow As New TableRow()
Table1.Rows.Add(tRow)
ListView1.DataSource = Table1
ListView1.DataBind()

引用返信 編集キー/
■55674 / inTopicNo.8)  Re[7]: ASP.NETのListViewで空行表示の方法
□投稿者/ もりお (309回)-(2010/12/09(Thu) 11:00:24)
2010/12/09(Thu) 11:10:03 編集(投稿者)
No55670(MM さん)に返信

> 行数が足りない時、空行を追加すればいいのでは?
> 空行はnullが挿入されるので、null対策も必要かと
> Dim tRow As New TableRow()
> Table1.Rows.Add(tRow)
> ListView1.DataSource = Table1
> ListView1.DataBind()

Table クラスと DataTable クラスを混同していませんか。
TableRow オブジェクトに null が自動で挿入されることはありません。
ListView.DataSource プロパティに Table オブジェクトを設定することはできません。

Table.Rows プロパティに TableRow オブジェクトを追加するのであれば、
ListView.DataSource プロパティに Table オブジェクトを設定する必要はありません。
ただし、ASP.NET の Table コントロールの配下には TableRow オブジェクトしか配置できま
せん。ListView は Item を作成する過程において TableRow オブジェクト以外のものも配置
します。事実上 ListView 内で ASP.NET の Table コントロールを使用することはできません。

データソースに手を加えるのであれば ObjectDataSource を使用しておられるので
ObjectDataSource.Selected イベントで行うべきでしょうね。
DataTable に Unique 制約があれば面倒なことになります。
さらに、それが表示項目になっていた場合、空データの表示を統一することができません。

そんなこんなで、空行を追加するのは方法の一つではありますが、一概にいいとはいえません。

引用返信 編集キー/
■55713 / inTopicNo.9)  Re[8]: ASP.NETのListViewで空行表示の方法
□投稿者/ MM (2回)-(2010/12/10(Fri) 00:32:59)
↑何を言ってるのかわかりませんが?
Dim Table1 As New DataTable<---SQLデータベースからSQLDataAdapterでデータ取得7件
DBから取得・・・省略
Dim tRow As New TableRow()
Table1.Rows.Add(tRow)<-----1件追加
ListView1.DataSource = Table1<----8件
ListView1.DataBind()<---8件がバインドされますが、8件目はNullレコードです
このような結果になりますが



引用返信 編集キー/
■55714 / inTopicNo.10)  Re[9]: ASP.NETのListViewで空行表示の方法
□投稿者/ もりお (311回)-(2010/12/10(Fri) 09:06:49)
No55713(MM さん)に返信

> ↑何を言ってるのかわかりませんが?

データソースに空行を追加するのは必ずしもいいとはいえません。
と、言いたかったのです。

> Dim Table1 As New DataTable<---SQLデータベースからSQLDataAdapterでデータ取得7件
> DBから取得・・・省略
> Dim tRow As New TableRow()
> Table1.Rows.Add(tRow)<-----1件追加

System.Web.UI.WebControls.TableRow クラスは継承構造において
System.Data.DataRow クラスとは関連がありません。

DataTable.Rows プロパティに TableRow オブジェクトを追加できるのは
Object を引数にとるメソッドを呼んでいるためです。
System.Data.DataRowCollection.Add(params Object[] values)

DataTable に行を追加するのであれば、DataRow を使うべきです。
MMさんのコードになぞらえるならこんな感じです。

Dim Table1 As New DataTable()
DBから取得・・・省略
Dim row As DataRow = Table1.NewRow()
Table1.Rows.Add(row)

> ListView1.DataSource = Table1<----8件
> ListView1.DataBind()<---8件がバインドされますが、8件目はNullレコードです

Table1 の各 Column のデータ型はわかりませんが、なんらかの形で TableRow が格納されて
いるはずです。TableRow が格納されている DataRow を Null レコードとはいいません。

今回は ObjectDataSource を使用している以上、ListView.DataSource プロパティに
データソースを設定してはいけません。ObjectDataSource.Selected イベントのハンドラーで
処理すべきです。

protected void ObjectDataSource1_Selected(
    object sender, ObjectDataSourceStatusEventArgs e) {
  型指定されたDataTable table = (型指定されたDataTable)e.ReturnValue;
  ...
}

> このような結果になりますが

どのような結果なのでしょう。記載されているのはコードのみです。

なりますが、なんなのでしょう。だから私の認識が間違っているといいたいのですか。
それとも、MMさんはその結果を信じないといいたいのですか。
遠慮されたのかもしれませんが、その必要はありません。最後まで言い切ってください。

引用返信 編集キー/
■55716 / inTopicNo.11)  Re[10]: ASP.NETのListViewで空行表示の方法
□投稿者/ MM (3回)-(2010/12/10(Fri) 09:59:21)
↑何を言っているのかわかりませんね
<asp:ListView ID="ListView1" runat="server" DataSourceID="ObjectDataSource1"
のやり方は通常業務では避けるべきなはずです。DB接続失敗を拾えない、並び順を変えたいとか汎用性に掛けるからです。
あるいはテーブル結合して条件付けをしたいなど
↓も意味不明
>>ObjectDataSource.Selected イベントのハンドラーで
処理すべきです。

protected void ObjectDataSource1_Selected(
object sender, ObjectDataSourceStatusEventArgs e) {
型指定されたDataTable table = (型指定されたDataTable)e.ReturnValue;
...
}
まったく意味不明。ObjectDataSource.Selected イベント?表示する時の問題のはず
これ以上、もりおさんと議論しても無駄なで失礼します。


引用返信 編集キー/
■55726 / inTopicNo.12)  Re[11]: ASP.NETのListViewで空行表示の方法
□投稿者/ もりお (312回)-(2010/12/10(Fri) 21:37:49)
No55716(MM さん)に返信

> ↑何を言っているのかわかりませんね

DataTable に行を追加するのであれば DataRow オブジェクトを作成するべきだ、ということ。
ObjectDataSource によって取得された DataTable に対して行を追加するべきだ、ということ。
2 つのことを言いたかったのです。

System.Web.UI.WebControls.TableRow クラスと System.Data.DataRow クラス
が異なることについてはわかっていただけたようでなによりです。

> <asp:ListView ID="ListView1" runat="server" DataSourceID="ObjectDataSource1"
> のやり方は通常業務では避けるべきなはずです。DB接続失敗を拾えない、並び順を変えたいとか汎用性に掛けるからです。

MMさんは ObjectDataSource について勘違いしていらっしゃいます。
ObjectDataSource は UI に対してデータの取得、更新、削除、並び替えのインターフェースを
提供して、UI とデータアクセスを分離します。ObjectDataSource を使用した方がプログラム
の汎用性は高くなります。

TableAdapter でデータアクセス部分を自動生成すればコードをほとんど記述することなく
アプリケーションを実装することも可能になります。

極小規模かつ仕様がよく変わるような場合には、ObjectDataSource を使わない方が柔軟に対応
できる、ということもあるかもしれません。しかし、どうしても UI とデータアクセスを結びつけ
るコードを記述しなければなりません。

業務では ObjectDataSource を使うやり方を避けるべき、というのは誤っています。

> まったく意味不明。ObjectDataSource.Selected イベント?表示する時の問題のはず
> これ以上、もりおさんと議論しても無駄なで失礼します。

まったくということはないでしょう。

MMさんは、DataTable に空行を追加して、ListView.DataSource プロパティに
DataTable を設定することで、表示するときの問題を解決することを提案されました。

私はその提案に対して、ObjectDataSource を使用しているので ListView.DataSource
プロパティに DataTable を設定するのではなく、ObjectDataSource.Selected イベントの
ハンドラーに渡される DataTable に対して空行を追加するべきだ、と言ったのです。

私と議論しても無駄ですか。これはすこし堪えました。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -