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 というマジックナンバーが気になって仕方がありません。