最近不才小弟負責撰寫專案設計的程式,可是卻碰上一個奇怪的問題,我找了很多資料、查了很多網站、試了很多方法,都告失敗。

      原始code如下(code:VB):

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    CType(DetailsView1.FindControl("TextBox4"),TextBox).Text=Profile.m_username

End Sub

      先說一下我原先的目的好了。我希望讓DetailView1之中有一個TextBox4的預設文字是使用者帳號,原本更天才,竟然異想天開就直接在程式碼打上(code:VB):

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    DetailsView1.TextBox4.Text=Profile.m_username

End Sub

      如果照上面這樣打,實際在執行時馬上就會跑出錯誤跟你說找不到實體,也就是編譯程式找不到TextBox4啦!你到底在哪裡?而且就算真的找到了,程式根本不認得TextBox4是什麼東西,所以要強制轉換型別。

      所以才會有FindControl這個方法存在,就是要讓躲在控制項或Template中的控制項無所遁形!因為編譯程式是沒有辦法直接找到這些躲起來的控制項的。

      可是現實總是殘酷的!我都用了FindControl還是找不到,是微軟騙我嗎?

      來看一下後來的code吧(code:VB)!

Protected Sub DetailsView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles DetailsView1.DataBound
        If Me.DetailsView1.CurrentMode = DetailsViewMode.Insert Then
            CType(DetailsView1.FindControl("TextBox4"),TextBox).Text=Profile.m_username
        End If
    End Sub

 


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    End Sub

       謎底在此揭曉了,原來我根本搞錯很多地方。要找控制項要在對的地方跟對的時間找!

      記得大二時上視覺語言課程時,老師非常要求我們要搞清楚像是Closed跟Closing到底差在哪裡,可惜我根本就沒有好好聽進老師的話,至今仍是一知半解。

      一開始我很直覺的覺得既然要讓TextBox有預設值,當然要在PageLoad時就指定,沒想到看MSDN時才被更正觀念說應該要在DetailsView的DataBound事件中就綁定好,此乃正確的時間也。

      至於正確的地點呢?我們可以看到code中多了一個條件判斷,要FindControl在DetailsView的Mode為Insert時才去find,不然找屁啊?孩子都還沒出生勒!

 

      高手們看到這裡馬上就發現我是個觀念非常薄弱的coding新手,請不要笑我;至於跟我一樣遇到問題的新手可以大家一起共勉之。

      我記得在MSDN上面看到有一位先進說:「不要害怕上MSDN看英文文件。」

arrow
arrow
    全站熱搜

    ipure 發表在 痞客邦 留言(1) 人氣()