none
程式執行後動態產生的物件,如何在編譯階段預先處理? RRS feed

  • 問題

  • 請教眾高手一個問題,

    小弟的目標:

    1. 在MDI環境下,拖曳到Child form A的檔案FileA會觸發事件,使得Child form B的tabControl新增一個tabPage

    2. 新增tabPage的同時,裡面會新增一個XPTable(或某ControlUnit),這個table的內容必須由處理FileA得到

    3. 使用者每拖曳一個目標檔案,就會產生一個處理好的tabPage及table

    目標1我已經弄好了,問題是在編譯階段,"未來"的tabPage或table根本還沒產生,我要怎麼事先寫Method來處理FileA?

    另,宣告一個物件的時候,有辦法使得"物件名稱"是變數嗎?

    ex:

    Object A = new Object();

    Object B = new Object();

    A 跟 B 可以是變數? 這樣我可以用method來產生Object

    我用perl跟python都有很簡單的解法,到C#我一時之間找不到關鍵字來自修

     

    感謝您的回覆,簡單的提示也很感激。

     

    2011年4月12日 下午 12:23

解答

所有回覆

  • 這種情況應該先開個陣列或集合吧?

    你可以用 File 名稱當作集合的索引。

    參照變數可以指給物件,但是你寫程式時也是先用別的變數處理才對,因為你的程式碼並不是動態產生...


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年4月12日 下午 02:29
  • C#有動態語言支援, 看看是不是您要的:dynamic (C# 參考)
    2011年4月13日 上午 02:33
  • 你的FileA是從Windows Explorer來得嗎?
    這邊有篇文章介紹如何從Windows Explorer拖曳到Winform的處理方式.
    http://www.dotnetcurry.com/ShowArticle.aspx?ID=192

    宣告一個物件的時候,有辦法使得"物件名稱"是變數嗎?
    用Type作為型別儲存即可,譬如
    Type t = typeof(MyType); //MyType即是物件類別名稱
    而要用t來處理物件操作,請參閱reflection之機制,參考搜尋google
    http://www.google.com/search?q=reflection+c%23&hl=zh-TW&prmd=ivns&source=lnt&tbs=lr:lang_1zh-CN%7Clang_1zh-TW&lr=lang_zh-CN%7Clang_zh-TW&sa=X&ei=QjelTYrTFY2-vgPrpfmaCg&ved=0CAcQpwUoAQ
    或是要簡單點,如同tihs回復使用dynamic型別,但只能用於dotNet 4.0之後,底層其實還是用reflection處理,只是用起來容易許多.

    PS:因為你的問題沒描述很清楚,如有誤會請在更仔細說明你的問題.

     

    2011年4月13日 上午 05:42
  • 感謝大家的熱心回應,或許小弟表達的不是很清楚。

    Parent form設為MDI環境是為了搭配DockPanel做出類似VisualStudio感覺的介面

    假設有兩個Child Form A & B,

    1. FormA實現一個CheckedListBox,檔案可透過Drag & Drop到FormA並新增成ListItem <-- 已完成

    2. 在FormA透過DragEnter事件得到檔名,同時在FromB的TabControl1新增一個分頁TabPage <-- 已完成

     

     目標: TabPage內要有一個table(我用XPTable),table的Column Row Cell內容由處理拖曳的檔案得來(就像Excel匯入csv一樣)

    3. 因此同樣在DragEnter事件,FromB新增分頁後,要在此分頁"內"再即時動態新增一個XPtable的物件 <-- 有點想不通

        我想說寫個method來做這件事,假設新增Table tableA = new Table();

        因為tableA不是變數,使用者每拖曳一個檔案進來,就又宣告一次tableA好像不對,所以才想問有沒有辦法讓tableA是變數?

     

    4. 另外檔案內容轉成table之後,會有一些透過滑鼠執行的動作,或者是在FormC透過一些設定,即時來update table <-- 快想通了

        這就是昨天標題想問的,主要是昨天很死腦筋的要把mouse事件寫在FormB裡面,問題是FormB當下根本就只有一個空TabControl啊?

        今天我把要求2寫成一個類別內的方法,然後順便在裡面把滑鼠事件指定好,這樣一宣告產生new TabPage及table後滑鼠事件就繫結好了。

        不過這主要是因為使用者透過滑鼠事件不用update條件,若是要從FormC設條件來update table的話,又要能找到目標table才行,

        還沒有實際寫到那邊,會遇到什麼問題不知道,不過想來會跟要求3如何實現有關。

        我看一些教學提到用反射或者Assembly來解決,持續研究中。


    2011年4月13日 下午 01:40