2010
04 26

ListView簡單介紹目前最通用的控制項

18:34:00   閱讀數 ( 1937 )   回應數 ( 0 )
以asp.net 2.0為主的專案,大部份依然是以GridView為主要顯示控制項,
到了asp.net 3.5開始,我們有了更彈性的選擇:ListView
Random這邊簡單的來介紹一下 ListView 的基本應用
為什麼說ListView是目前最通用的控制項?
因為以往的Repeater、DataList、GridView等功能,ListView都能夠輕易的達成,
它是前幾個控制項的昇級版,所以,它當然能支援分頁功能
(在asp.net2.0中,我們的Repeater與DataList都是自已透過PagedDataSource實作分頁)


那麼,我們先來一點基本的...
模擬Repeater控制項

假設今天我想讓ListView顯示出來的是像這樣的Tag:
<div>
	<ul>
		<li>ID:[0] 時間0</li>
		<li>ID:[1] 時間1</li>
		....以下略....
	</ul>
</div>

那我們就可以這樣寫:
<asp:ListView ID="Main_LV" runat="server" ItemPlaceholderID="PH_Inner">
<LayoutTemplate>
		
	<div style="width:300px;border:gray 1px dotted;margin:2px">
		<ul>
			<asp:PlaceHolder ID="PH_Inner" runat="server" />
		</ul>
	</div>

</LayoutTemplate>
<ItemTemplate>

	<li>
		<%# Eval("Name") %> &nbsp;	
		<small><%# Eval("DateTimeCreate","{0:yyyy-MM-dd}") %></small>
	</li>

</ItemTemplate>
</asp:ListView>
OK, 像這樣是一個基礎的ListView結構,
以<asp:ListView>為主的Tag,內嵌LayoutTemplate、ItemTemplate兩層Tag,

我想大家對ItemTemplate都很熟悉,就是定義資料的樣版,
陌生的是LayoutTemplate,簡單的說,它是拿來定義外部結構用的,
比較特殊的是,我們必需在LayoutTemplate中放置一個runat="server"的控制項,
並且告訴ListView,這個位置是拿來顯示內容的位置。
( 本例使用PlaceHolder控制項,ID為PH_Inner,所以我們可以看到在ListView中,
  我們設定了一個名為ItemPlaceHolderID的屬性,就是我們的PH_Inner )


再來是資料來源,因為資料來源很多種,可以配合伺服器控制項或其他方式,
不過Random為了簡單起見,我們這邊先用假資料代替,那今天的CodeFile則如下:
/// <summary>暫用的Member類別</summary>
public class Member
{
	public String Name { get; set; }
	public DateTime DateTimeCreate { get; set; }
}

// 假資料用的 List<T> static field.
protected static List<Member> m_Members;

// 這邊使用一個 static property回傳List<T>充當資料來源
protected static List<Member> Members
{
	get
	{
		if( m_Members == null )
		{
			m_Members = new List<Member>();

			for( var i = 0 ; i <= 9 ; i++ )
			{
				m_Members.Add( new Member
				{
					Name = "ID:[" + i + "]",
					DateTimeCreate = DateTime.Now.AddDays( i )
				} );
			}
		}
		return m_Members;
	}
}

protected void Page_Load( object sender, EventArgs e )
{
	//所以我們在PageLoad時, 就將資料指定給ListView, 並執行DataBind
	Main_LV.DataSource = Members;
	Main_LV.DataBind();
}

OK, 至此, 我們執行程式就可以看到執行的畫面如下:
執行成功畫面
正確無誤吧,由以上最簡單的方式,我們先模擬了Repeater的顯示方式。


模擬GridView控制項
接下來,是我們最常用的GridView控制項,ListView當然能簡單達成這個需求。

我們都知道GridView最後Render出來是一個Table的HTML結構,
那麼我們只要在ListView中填入相應的Tag即可,
所以我們將HTML的部份改為:
<asp:ListView ID="Main_LV" runat="server" ItemPlaceholderID="PH_Inner">
<LayoutTemplate>
		
	<div style="width:300px;border:gray 1px dotted;margin:2px">
		<table border="1" bordercolor="#CCC" style="width:90%;margin:10px">
		<tr>
			<td>編號</td>
			<td>名稱</td>
			<td>新增日期</td>
		</tr>
			<asp:PlaceHolder ID="PH_Inner" runat="server" />
		</table>
	</div>

</LayoutTemplate>
<ItemTemplate>

	<tr>
		<td><%# Container.DataItemIndex + 1 %></td>
		<td><%# Eval("Name") %></td>
		<td><small><%# Eval("DateTimeCreate","{0:yyyy-MM-dd}") %></small></td>
	</tr>

</ItemTemplate>
</asp:ListView>
OK, 改完我們再次執行頁面,我們就能看到這樣的輸出畫面..

模擬GridView

這樣就是標準的Table結構囉~

最後是...模擬DataList控制項

最後一項簡單任務,就是用ListView模擬DataList的顯示,
這時我們要用到ListView的另一個嵌套屬性 "GroupTemplate",
我們先來看Code的部份:
<asp:ListView ID="Main_LV" runat="server"
 GroupPlaceholderID="PH_Group" ItemPlaceholderID="PH_Item" GroupItemCount="3">
<LayoutTemplate>
		
	<div style="width:300px;border:gray 1px dotted;margin:2px">
		<table border="0" style="width:90%;margin:10px">
			<asp:PlaceHolder ID="PH_Group" runat="server" />
		</table>
	</div>

</LayoutTemplate>
<GroupTemplate>
	
	<tr>
		<asp:PlaceHolder ID="PH_Item" runat="server" />
	</tr>

</GroupTemplate>
<ItemTemplate>

	<td>
		<div style="border:#336699 2px solid;margin:5px">
			<b><%# Container.DataItemIndex + 1 %></b> 
			<%# Eval("Name") %>
			<small><%# Eval("DateTimeCreate","{0:yyyy-MM-dd}") %></small>
		</div>
	</td>

</ItemTemplate>
</asp:ListView>
OK, 這邊可以看到我們在ListView的Attributes中加入了一些屬性,
分別是GroupPlaceholderID與GroupItemCount,
大家應該有印象,在使用DataList的時候會用到名為RepeatColumns的屬性,
我們可以把GroupItemCount想像成跟它一樣,設定的是一行要顯示幾項資料。

接下來我們加入了GroupTemplate,裡面放置了<tr></tr>的Tag,
中間則放置了PlaceHolder來設定ItemTemplate顯示位置,
你可以看到ListView中的各個Attribute是對應到不同Template中的ID。

觀念上、你可以這麼想:
LayoutTemplate - 最外層 (<table>....</table>)
GroupTemplate  - 資料行 (<tr>...</tr>)
ItemTemplate   - 資料欄 (<td>...</td>)

所以就會像上面這樣了,
說穿了也只是TR、TD的Tag做變換而已,

最後顯示的畫面如下:
模擬DataList

到此,我們已經能用ListView全數取代之前常用的幾個控制項,
在網頁設計的一般排版上使用已經不是問題,

當然,並不是說就完全地不再用其他資料控制項,
一般還是要依當下的使用需求,照狀況去決定,

雖然以一般使用者來說,ListView要手動寫的Tag是比較多,
但也因為如果,它所提供的彈性較大,也能夠應付更多樣化的需求,

ListView的一些細節,各位可以參考MSDN
能多一樣好用的控制項能用,何樂而不為呢
其實還有很多細節可以說明,待Random稍加整理再寫好了...

2010-04-26 18:34:00 By RazgrizHsu       1937 Visits

關於站長 About

RazgrizHsu 的大頭照o.o RazgrizHsu
程式設計之偉大航道
其中的一個小設計師
致力於開發技術研究
願能與各位一同成長!

大家來噗浪 Plurk

免責聲明 Disclaimer

  • 本站所轉載或引用之資料,其版權和知識產權屬於原始所有者。
  • 本站雖力求資料準確,但無法保證或擔保全數資料均準確無誤,許多資料具有時效或環境上的不同,在使用本站資料前應先行初步判斷,若是發現問題,歡迎您通知本站。
  • 在任何情況下,因本站所造成的直接、間接、偶然或其他衍生問題,本站不承擔任何責任。
RandomART程式道-88x31連結用Logo
Copyright © Runart.net 暴走的藝術 since 2009 - 2011
Design By Razgriz Hsu, Asp.net MVC 3 & SqlServer 2008R2.