2009-11-11 48 views
0

我想programaticaly改變一些價值觀NSF項目,然後要保存它(即編輯NSF文件,然後保存版本)如何使用c#編輯NSF文件?

例如:

我想將所有的發件人名稱發送郵件至「[email protected]」(使用Domino.dll)。

溶液I嘗試:(Swaping向和從值)

字符串Temp_From =((對象[])docInbox.GetItemValue( 「從」))[0]作爲字符串; String Temp_SendTo =((object [])docInbox.GetItemValue(「SendTo」))[0] as String; docInbox.ReplaceItemValue(「From」,Temp_SendTo); docInbox.ReplaceItemValue(「SendTo」,Temp_From); docInbox.Save(true,false,false);

/*適用於以下領域也:

從:AltFrom,DisplayFrom,DisplayFrom_2,dspFrom,ForwardedFrom,INetFrom,tmpDisplayFrom

對於要:displaySendTo,EnterSendTo,Envelope_to,tmpDisplaySendTo

還試圖保存:docInbox.Save(true,true,true); */

在成功編輯修改後的上述代碼中,變量值不會反映在Nsf文件中。 但是,當我讀編輯NSF(複製在不同的位置修改後的文件)文件編程它顯示更改後的值

+0

當你說在NSF文件中未改變的值時 - 你如何查看NSF?如果通過Notes客戶機中的視圖,很可能視圖沒有被刷新。嘗試使用文檔屬性查看實際的基礎字段值。另外,請確認該視圖正在使用您已更改的相同字段。 –

回答

0

「編程指南,第2卷。(爲什麼變化是不可見的位置?)的LotusScript/COM/OLE類「可以在這裏找到: http://www-12.lotus.com/ldd/doc/uafiles.nsf/docs/DESIGNER70/

儘管簡單總結一下,一旦你有一個文檔的句柄,你可以使用Items屬性迭代該文檔的所有現有字段(」條目「);並且您可以使用ReplaceItemValue和/或AppendItemValue方法更新該文檔上的給定字段。

0

您是否使用Notes客戶端檢查結果?我想這種行爲可以通過客戶端的主動緩存來解釋。嘗試從數據目錄中刪除文件cache.ndk,然後再檢查程序的結果。

此外,註釋「項目」通常包含值數組 - 如果例如郵件已發送給多個人,則您交換SendToFrom域的方法將丟失數據。請嘗試複製整個object[]

0

我做了一次。

您必須爲您的項目添加一個新的參考,並在「添加參考」對話框中選擇「COM」。在列表中找到名爲「Lotus Domino Objects」的組件並添加它。您會看到一個名爲'Domino'的新參考添加到您的項目中。該COM組件由Lotus Notes客戶端安裝。您必須在開發機器上安裝它,並且在運行應用程序時也必須安裝它。

從這一點開始,您可以使用NotesDesigner中使用lotusscript進行開發時可用的大多數類。

添加一個合適的 '使用' 的語句:

using Domino; 

創建Notes會話:

NotesSession session = new NotesSession(); 
session.Initialize("mypassword"); 
//this uses your current Notes location and id. 
//i think you can use session.Initialize("") if notes is already running and you are already logged in. 

獲取數據庫:

NotesDatabase notesDb = session.GetDatabase("server", "database", false); 

獲得一些文件,例如:今天約會(如果你打開的數據庫是你的mail.nsf)

NotesDocumentCollection col = null; 
try { col = notesDb.Search("Form = \"Appointment\" & StartDate = @Today", null, 0); } 
catch (Exception e) { } 

迭代通過您的收藏:

if (null != col) 
{ 
    NotesDocument doc = col.GetFirstDocument(); 
    while (doc != null) 
    { 
     //do your magic tricks 
     doc = col.GetNextDocument(doc); 
    } 
}  

的一個問題我用這個接口注意:沒有session.Close()方法,也沒有任何類似事件,我的會議沒有在服務器一旦被關閉GC收集了C#對象。一旦我打開了一個新的NotesSession(),只要我的c#線程還活着,它就一直保留在多米諾服務器上。爲了解決這個問題,我必須創建後臺線程,並且只能從線程內實例化新的NotesSession()對象。線程在啓動之前也必須使用STA公寓模式進行設置。

Thread thread = new Thread(new ThreadStart(MyFunctionThatInstantiatesNewNotesSessions)); 
thread.SetApartmentState(System.Threading.ApartmentState.STA); 
thread.Start(); 
thread.Join(); 

我不知道如果這個問題真的是在接口有問題,或者別的東西,我做錯了什麼在我的代碼。但是如果有人面臨這個問題:線程是我修復它的方式。