WebControl的動態添加

 相信有了ASP.NET以後,給很多的程序員一個福音。大家發現,原來寫Web可以好像寫Windows Form一樣的。嘗試着寫了不少,發現的確好用。

    不知道大家有沒有仔細的考慮過頁面上的每一個控件,也就是WebControl。前幾天我因爲工程的需要,要在運行期動態的添加WebControl,至於是添加什麼,是TextBox還是Radio抑或是DropDownList,在設計期都是不得而知的。而且,添加的數量也是不能算的。這下可爲難了。

    在經過了多方的詢問,以及在CSDN上衆多大蝦的指點,小弟終於仔細的研讀cs源碼,仔細地把以前沒有好好看得系統自動生成的代碼分析了一下。收穫還是不錯的。
    首先,我根據大蝦的指點在Page_Load()這個事件中寫下了一些動態生成的WebControl。
    void Page_Load(object sender, EventArgs e)
    {
        TextBox tb = new TextBox();
        this.Controls.Add(tb);
    }
    這樣最簡單的一個TextBox就動態的生成了。但是,當我在執行一些其他的事件的時候,這個頁面就會自動的刷新,這裏的tb就會重新的生成一遍,導致所有的內容全部消失。也許讀者現在會說你只要把他聲明成爲static得就可以了。沒錯,我也向你說的一樣,static果然好用,也讓我激動了很長時間。內容保留了。而且,我加上for循環,就完全可以生成n個控件。
    for (int i=0; i<n; i++)
    {
        static TextBox tb = new TextBox();
        tb.ID = i.ToString();
        this.Controls.Add(tb);
    }
    注意,這裏的tb.ID = i.ToString();這句話是很重要的,因爲在頁面中,是不允許出現重複ID的Control的。所以爲了避免所有動態生成的控件的ID都是默認的,會重複的。(不信你試試看,反正我在這費了半個小時。)

    這樣看上去比較完美了,但是如果你操作的話,就會發現一個問題,你根本不可能方便的在別的事件操作這些Controls,只能這樣
    TextBox tb = (TextBox)this.Controls[j];
    這裏的j就是你添加的所有控件的編號了,選中哪一個就是用哪一個。

    問題來了,如果是在整個的頁面這個類中定義這樣的控件,那麼在那個事件中都能夠方便的使用,但是這樣就不會很隨意,個數和類型(就是到底是TextBox還是DropDownList)都不能任意的變動。而用Controls[j]這樣是唯一的辦法。但是直接this.Controls.Add()也太不像話了。
    這個時候,我發現了有一個很好的控件,Table。這個東西太好用了,只要把自己的Controls添加到TableCell,然後把TableCell->TableRow->Table。就完事ok了。只要在頁面這個類中定義一個static的Table,那麼只要在 Page_Load() 的 if (!IsPostBock)中把自己想要得Controls完完整整的寫出來,然後添加到Table中就好了。記得要計數哦。爲什麼,當然是要在使用的時候能夠準確的定義Table.Rows[i].Cells[j].Controls[k]了。
    此時,只要在頁面中你想要的位置給一個PlaceHold控件,Page_Load()事件中寫上ph.Controls.Add(table1);就好了,你得Table也能夠按照你的想法放到相應的位置了。

    到了這裏,問題的難點基本解決了,剩下的只是仔細的問題了。那就好說了。這只是我遇到的問題的一些研究,希望對大家在學習asp.net中有一點幫助。
    也希望大家能和我交流,共同進步。
    我的mail是 [email protected] 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章