[Tips]如何找到ListView的LayoutTemplate上的control

  • 34218
  • 0

[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/