none
Datalist的ItemTemplate內的Checkbox RRS feed

  • 問題

  • 我想要取得Datalist內的原件

    目前我的datalist會產生數筆資料

    我是靠for 迴圈逐筆去取得我要的值

    但是我始終取不到裡面的checkbox

    我不是寫在另外的事件中 不是該datalest中

    語法如下

     protected void PlanLinkButton_Load(object sender, EventArgs e)

            {

                LinkButton PlanLinkButton = (LinkButton)sender;

                for (int i = 0; i < StaffDataList.Items.Count; i++)

                {

                    CheckBox StaffCheckBox = (CheckBox)StaffDataList.TemplateControl.Controls[i].FindControl("StaffCheckBox"); 

                    if (StaffCheckBox.ToolTip.ToString() == PlanLinkButton.CommandArgument.ToString())

                    {

                        PlanLinkButton.ForeColor = StaffCheckBox.ForeColor;

                    }

                }

            }

    會無法取得 我想請問各位是否有好的解決方法^^?

    2011年9月17日 上午 04:22

解答

所有回覆

  • hi, 您這樣的資訊有點不夠,請教您幾個問題:

    1. PlanLinkButton的Load,這是什麼事件?您某個Button的Load?為什麼要寫在這呢?
    2. 您執行時,程式有進去for loop的block裡面嗎?如果沒有,很有可能是事件順序的問題,在這個時間點,DataList還沒有繫結資料項目。
    3. 您的aspx上,DataList裡面放的CheckBox是怎麼放的?可不可以把那一段code貼上來,不然連id是不是打錯都無法評斷
    4. 取不到裡面的checkbox,是指StaffCheckBox會是null嗎?所以您這一段程式碼run time時,應該是在StaffCheckBox.ToolTip這邊就會跳NullReference Exception?

    回到最有可能出現問題的部分,通常DataList裡面要FindControl,以您的case,應該只需要寫成:

    var check = StaffDataList.Items[i].FindControl("checkbox的id") as CheckBox;

    就可以了。

    記得後面如果要用到check,要先判斷check是否為Null,防呆。


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    2011年9月17日 上午 04:37
    版主
    • 已標示為解答 Open1008 2011年9月18日 上午 03:47
    2011年9月17日 下午 01:46
  • hi, 您這樣的資訊有點不夠,請教您幾個問題:

    1. PlanLinkButton的Load,這是什麼事件?您某個Button的Load?為什麼要寫在這呢?
    2. 您執行時,程式有進去for loop的block裡面嗎?如果沒有,很有可能是事件順序的問題,在這個時間點,DataList還沒有繫結資料項目。
    3. 您的aspx上,DataList裡面放的CheckBox是怎麼放的?可不可以把那一段code貼上來,不然連id是不是打錯都無法評斷
    4. 取不到裡面的checkbox,是指StaffCheckBox會是null嗎?所以您這一段程式碼run time時,應該是在StaffCheckBox.ToolTip這邊就會跳NullReference Exception?

    回到最有可能出現問題的部分,通常DataList裡面要FindControl,以您的case,應該只需要寫成:

    var check = StaffDataList.Items[i].FindControl("checkbox的id") as CheckBox;

    就可以了。

    記得後面如果要用到check,要先判斷check是否為Null,防呆。


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki

    PlanLinkButton 是在另外一個datalist裡面。

    我是這樣 我有兩個 datalist 一個是放行事曆 另外一個datalist 是放人員名單 是利用 checkbox

    我現在是要判斷 人員名單內的checkbox 是否有被選取 如果有選取 就會顯示該人員的行事曆  linkbutton跟checkbox字體顏色要相同去區別

    目前我已經完成判斷 人員是否已經選取

    我現在要做的就是 當 PlanLinkButton_Load 去載入行事曆資料時 去判斷 人員datalist 內的 checkbox 字體顏色

    所以我利用for loop 去比對人員名單 並取得 checkbox的 字體顏色

    大概是這樣

    2011年9月18日 上午 02:22
  • protected void PlanLinkButton_Load(object sender, EventArgs e)
            {
                LinkButton PlanLinkButton = (LinkButton)sender;
                for (int i = 0; i < StaffDataList.Items.Count; i++)
                {
                    DataListItem DLI = (DataListItem)StaffDataList.Items[i];
                    CheckBox StaffCheckBox = (CheckBox)DLI.FindControl("StaffCheckBox"); 
                    if (StaffCheckBox.ToolTip.ToString() == PlanLinkButton.CommandArgument.ToString())
                    {
                        PlanLinkButton.ForeColor = StaffCheckBox.ForeColor;
                    }
                }
            }
    感謝 this MVP 我參考你那篇文章改好了!
    2011年9月18日 上午 03:48
  • DataList.Items應該預設就是DataListItem的型別了,不需要在額外強轉型吧?

    var check = StaffDataList.Items[i].FindControl("checkbox的id") as CheckBox;

    這一行真的不能work嗎?

    還有,FindControl+轉型,建議你一定要防呆。

    強轉型容易出現exception,所以建議用as+判斷null。

    如果你堅持還是要用那種可能會有問題的寫法,那我也沒辦法...


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    2011年9月18日 上午 08:19
    版主
  • 因為這些內含樣板(Template)的大型控制項,很多觀念與作法都雷同

    希望對您有幫助
    至少帶來一點靈感。

    [習題] Repeater + CheckBox,批次刪除。

    http://www.dotblogs.com.tw/mis2000lab/archive/2011/05/09/repeater_multi_delete_20110509.aspx

     

    [Repeater]三個事件的執行先後?ItemDataBound / ItemCreated / ItemCommand

    http://www.dotblogs.com.tw/mis2000lab/archive/2011/09/07/repeater_itemdatabound_itemcreated_itemcommand.aspx

    僅供參考。

     

     


    我的書 與 ASP.NET教學網站 http://www.dotblogs.com.tw/mis2000lab/
    2011年9月21日 上午 02:57