none
關於 自訂Server Control 中 Enum property 問題 RRS feed

  • 问题

  • 各位老大好

    因為這個問題在台灣msdn問好久都沒人理我 >_<

    所以跑來這邊問問看是不是有答案

    因為這個問題為跨project跨Namespace的引用問題

    一共有三個project(CONTROL DLL,DataLib project,Web project)

    敘述的比較複雜一點

    小弟我儘量說明詳清楚一點

    希望各位大大們幫忙

    謝謝!!

    小弟目前在開發Custom Control 時遇到一個問題

    我希望開發一個Control(namespace:XXX.cortrols)

    該Control 需要使用一個Enum property 叫DataType 

    但該Enum可能在未來每個案子都會有不同的Enum List

    我不希望在未來每個案子進行前都需要重新維護control裡的 Enum 再重新compilier

    為了克服這個問題

    我在外部建立了一個project(namespace:XXX.DataLib),裡面放了一個TT(T4檔)

    透過該TT可依Database資料設定,動態產生Enum

    (由於XXX.Datalib 也放置每個案子的Entity framework 因此本來就需要新建置)

    所以我將該control的project參考XXX.DataLib

    因此我在Web project中同時參考了XXX.DataLib project 與XXX.Controls.dll

    但結果並未如我預期

    我在Web project中Desigb Time 開發畫面中下拉 DataType property

    永遠看到的都只有在Compilier XXX.Controls.dll時 的那些項目

    即使 XXX.DataLib project 中的DataEnum  變更了也不會在Designer裡選的到

    感覺是Control 在 compilier Time 時就透過GetDesignTimeHtml 把Enum的List寫死進Controls.dll中了

    而不是在Design Time時才動態到XXX.Datalib抓取Enum清單

    不知道是否有甚麼方法可以達到我在Design Time時可以依外部dll的Enum list 或其他方法

    讓我取得最新的List

    附上部分原始碼

    //XXX.DataLib.dll  

    namespace XXX.DataLib
    {

    //(透過TT 動態產生的程式碼)

    public enum DataTypeEnum
    {

    Emp = 1,
    Dept = 2,
    Store = 3,
    Program = 4,
    }
    }

    //XXX.Controls.dll

    using XXX.DataLib

    namespace XXX.Controls

    public class XXXLabelTextBox : System.Web.UI.WebControls.CompositeControl

    {

            private DataTypeEnum _DataType=DataTypeEnum.Emp;
            public DataTypeEnum DataType{
                get {return (ViewState[this.ClientID + "DataType"] == null) ? _DataType : (DataTypeEnum) ViewState[this.ClientID + "DataType"] ;}
                set {ViewState[this.ClientID + "DataType"]=value;}
            }

    }

    2015年4月17日 2:05

全部回复

  • 你可以嘗試把:

    ViewState[this.ClientID + "DataType"] 

    改成:

    ViewState["DataType"] 


    ASP.NET Forum
    Other Discussion Forums
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    2015年4月20日 2:53
  • 跟這個無關

    我後來已經改用如下的方式存ViewState

    但結果仍是一樣

    public DataTypeEnum DataType{get;set;}

    ......

    protected override void LoadViewState(object savedState)
            {
                object[] myState = (object[])savedState;
                if (myState[0] != null) { base.LoadViewState(myState[0]); }
                if (myState[1] != null) { DataType = (DataTypeEnum)myState[1]; }
        ......
            }       

    protected override object SaveViewState()
            {
                object baseState = base.SaveViewState();
                object[] States = new object[8];
                States[0] = baseState;
                States[1] = DataType;
        ......
                return States;
            }

    嗚~~來個神人解答我的問題吧 >_<


    2015年4月22日 1:20