2013-02-15 71 views
0

我需要一個項目的副本,但我沒有找到類似Clone()或其他的方法。 這是我的代碼:如何複製項目?

private void Change(ArrayList SecuenciasIniciales, Project pj) 
     { 
      Project pjTemp = pj; //not make a copy else the same reference 

      for (int i = 0; i < SecuenciasIniciales.Count;i++) 
      { 
       int[] secuencia = (int[])SecuenciasIniciales[i]; 
       ChangeProjectTemp(secuencia,ref pjTemp,pj); 

       pjTemp.Application.LevelingOptions(false, true, true, PjLevelOrder.pjLevelPriority, true, Type.Missing, Type.Missing, PjLevelPeriodBasis.pjDayByDay, true, false, Type.Missing); 
       pjTemp.Application.LevelNow(true); 

       if (Directory.Exists(Server.MapPath("") + "\\sample.mpp")) 
       { 
        System.IO.File.Delete(Server.MapPath("") + "\\sample.mpp"); 
       } 

       pjTemp.Application.FileSaveAs(Server.MapPath("") + "\\sample.mpp", PjFileFormat.pjMPP, Type.Missing, Type.Missing, Type.Missing, 
     Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 

       pjTemp.Application.FileSave(); 
       pjTemp.Application.DocClose(); 
       pjTemp.Application.Quit(PjSaveType.pjDoNotSave); 

       } 
} 

我不希望pj變化。解決辦法是什麼?

+0

爲什麼在EARTH上使用ArrayList? – 2013-02-15 22:18:07

+0

'ArrayList'在2013年2月?真的嗎? – 2013-02-15 22:18:23

+0

EARTH ?,是Microsoft Project的一個項目 – Esneyder 2013-02-15 22:23:40

回答

0

有兩種可能的選擇如何做的副本項目和他們兩個都致力於解決不同的任務。

任務1:由於COM調用速度較慢,您希望製作項目的副本以執行項目的更快分析。

解決方案:閱讀所有你想知道關於通過MS項目COM接口項目,將數據保存到您自己的數據結構,做任何你想要的數據結構。 該任務的替代解決方案可以將項目保存爲XML並將XML反序列化爲數據結構。

任務2:您想使用MS Project API製作項目的副本,以便與新項目一起使用。例如。您的初始項目是一個模板。

解決方案:使用Application.FileSaveAs和後來的工作與新創建的文件。

重要的是要明白,您使用API​​處理您的項目到MS Project,但MS Project不是.NET應用程序,並且.NET功能如IClonableObject.MemberwiseClone都不適用於您。你只能告訴MS Project做什麼,它會以某種方式做到這一點,但沒有人知道如何做。

+0

好吧,但問題是,我將生成更多的36個項目,我想只選擇一個,我是否必須保存像Application.FileSaveAs所有mpp項目? – Esneyder 2013-02-16 13:28:57

+0

對不起,但我不明白你的用例。如果您需要克隆36個項目以選擇其中的一個項目,例如你有跨項目鏈接 - 那麼是的,你將不得不克隆所有的項目或以某種方式找到孤立的項目子集。好的是你可以輕鬆刪除文件。 – melan 2013-02-17 05:04:34

+0

好的。我相信這將是解決方案。 – Esneyder 2013-02-18 14:44:20

0

我相信你正在尋找這個

Deep Cloning Objects in C#

此鏈接在這裏也可能是使用的

Deep vs shallow cloning

此代碼是從我comment-鏈接改爲項目爲你着想。

它可以爲你工作

淺表副本例如:

class Project : ICloneable 
{ 
    //rest of your class 
    int blah; 
    string blah2; 

    public Project() 
    { 

    } 
    //rest of your class 

    public object Clone() 
    { 
     return this.MemberwiseClone();  // call clone method 
    } 
} 

然後在你的代碼表明做這個 -

Project pjTemp = (Project)pj.Clone(); 
+0

例外:類型必須是可串行化的? – Esneyder 2013-02-15 22:34:57

+0

序列化你的對象只是把它變成位和字節。你的對象是否使用指針引用內存中的其他對象?或者項目的所有組件對於那個特定的「項目」對象是唯一的?如果唯一 - 您可以使用接口「ICloneable」實現該類,並使用頁面上所述的克隆函數:http://en.csharp-online.net/ICloneable向下滾動到'Person'類。如果你的類在內存中引用了其他對象,你將不得不做所有的深層複製操作,因爲ICloneable無法知道如何深度複製每個類的類。 – Bizzle 2013-02-16 02:02:44

+0

我會嘗試這 – Esneyder 2013-02-16 13:13:45