[Tips]如何找到ListView的LayoutTemplate上的control
前言
這一篇如果已經知道答案的人,一定會覺得很好笑,這有什麼記錄的價值。不過,實際上還是看到一堆有經驗的人,會突然不知道怎麼找ListView裡,LayoutTemplate上的control。包括我自己,也試了幾次,才突然恍然大悟,根本是在搞笑。所以隨手記錄一下,讓不小心被困住的朋友們,可以快速的突破自己的盲點。
問題
在2.0常用GridView,在3.5常用ListView的人就知道,ListView最大的好處是:Layout的部分可以不被完整封裝起來,而可以透過LayoutTemplate即可控制Layout的部分,ItemTemplate中,要繫結資料的部分,也可以自行透過html或server control來進行排版與操作。其他使用上的部分,從GridView到ListView,幾乎就是把Row改成Item,就都可以Work了。
如果要找的Control,是放在ItemTemplate裡面,要怎麼找?
沒錯,跟GridView沒啥太大差異,如果是在ItemDataBound事件裡面,就要用e.Item.FindControl去找,例如:
protected void lvCase_ItemDataBound(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem)
{
ListViewDataItem dataItem = (ListViewDataItem)e.Item;
DataRowView rowView = (DataRowView)dataItem.DataItem;
bool checkIsNotVisible = CheckVisible();
if (checkIsNotVisible)
{
//FindControl of e.Item by Control's ID
(dataItem.FindControl("chkItem") as CheckBox).Visible = false;
}
}
}
問題來了,LayoutTemplate可不屬於ListViewItemType.DataItem,ListViewItemType還有什麼呢?只剩下InsertItem跟EmptyItem,一個是EmptyTemplate裡面的,一個是InsertTemplate裡面的。那LayoutTemplate的呢?怎麼辦?
難道要把原本放在LayoutTemplate的部分,放進去ItemTemplate裡面,再用程式控制?還是要放在InsertTempalte裡面,再想辦法用程式去塞?該不會還要用hidden,再用JavaScript去改呈現的值吧?
Solution
其實,沒那麼難啦…相信大家只是一時迷惘了。
LayoutTemplate的部分,代表只是Layout上的東西,而不會跟著資料一直repeat。所以,當然不會在ItemDataBound裡面去找這個Control。但是,這個Control就是放在ListView這個container裡面,我無法直接在頁面上用this.ControlID去取得它。難道要用foreach去掃ListView上的Items? 也不對,我們不是DataItem,所以不適用這種解法。
既然,已經知道這個Control是被放在ListView這個Container裡面,那解法就呼之欲出了。
不管在哪一個事件,基本上,就只需要用this.你的ListView.FindControl(“Control的ID”),就可以直接取到ListView上LayoutTemplate上的Control了。
例如:
// 在Page_Load裡面
// 合計.
Label planCount= this.lvCase.FindControl("lblPlanCount") as Label;
planCount.Text = myCount.ToString();
結論
就這麼簡單!往最簡單的原理去想,就不會被眼前的假象或習慣所迷惘。
blog 與課程更新內容,請前往新站位置:http://tdd.best/