2013-03-20 117 views
1

我想弄清楚如何通過C#獲取當前在Lotus Notes上打開的文檔,但是我不能。儘管我在Google上搜索了半天,但找不到任何有用的信息。獲取當前打開的文檔

用我的代碼我得到我想要的視圖,我想要的數據庫等,但我只想獲得打開的文檔。我嘗試了類似IsUIDocOpen的東西,但沒有一個完整的集合包含它爲true。

有人知道打開的文檔和未打開的文檔在Domino API之間是否有任何不同嗎?我的解決方法是獲取電子郵件的主題和電子郵件的大小,並比較每個電子郵件和匹配時間,獲取條目ID,然後獲取我需要的信息 - 但這需要很長時間,特別是當收件箱很大時。

有什麼建議嗎?

這裏是我的代碼:

NotesSession session = new NotesSession(); 

session.Initialize(sPassword); 
notedb = session.GetDatabase(server, filename, false); 
if (notedb.IsOpen) 
{ 
    mailView = notedb.GetView("$Inbox"); 

    mailDoc = mailView.GetLastDocument(); 
    //mailDoc = mailView.GetDocumentByKey(); 
    try 
    { 
    while (mailDoc != null) 
    { 
     NotesItem item = mailDoc.GetFirstItem("From"); 

     if (item != null) 
     { 
     MessageBox.Show("From = " + item.Text); 
     } 
    } 
    } 
} 

解決方法:應該是這樣的:mailDoc = mailView.GetCurrentDocument(); //但顯然這種方法不存在:d

=========== ================================================== ======================== 解決方案代碼:

Type NotesUIWorkspaceType = Type.GetTypeFromProgID("Notes.NotesUIWorkspace", true); 
object workspace = Activator.CreateInstance(NotesUIWorkspaceType); 
object uiDoc = NotesUIWorkspaceType.InvokeMember("CurrentDocument", BindingFlags.GetProperty, null, workspace, null); 
Type NotesUIDocument = uiDoc.GetType(); 
object Subject = NotesUIDocument.InvokeMember("FieldGetText", BindingFlags.InvokeMethod, null, uiDoc, new Object[] { "Subject" }); 
string subject = "test"; 

NotesUIDocument.InvokeMember("FieldSetText", BindingFlags.InvokeMethod, null, uiDoc, new Object[] { "Subject", subject }); 
object Body = NotesUIDocument.InvokeMember("FieldGetText", BindingFlags.InvokeMethod, null, uiDoc, new Object[] { "Body" }); 
+1

您是使用Domino API還是Lotus Notes Interop COM類?如果您使用的是Domino,它將無法工作:它使您可以訪問Domino服務器上的數據庫,而不是Lotus Notes程序。 – 2013-03-20 15:14:34

+0

哪裏可以找到Lotus Notes Interop COM類?謝謝 – peterpeterson 2013-03-21 08:50:57

+1

看看這裏:http://www.ibm。com/developerworks/lotus/library/domino-msnet/index.html。它適用於VB.Net,但如果我沒有記錯的話,在C#中可以訪問名稱空間中的包裝類,以便創建類。 – 2013-03-21 09:28:36

回答

2

如果你正在使用你需要使用互操作類得到你想要的東西......見here

+0

我使用interop.Domino但我看不到NotesUIView ..任何其他建議? – peterpeterson 2013-03-20 15:45:03

2

你需要先拿到NotesUIWorkspace,然後使用CurrentDocument財產

NotesUIWorkspace workspace = new NotesUIWorkspace(); 
NotesUIDocument uidoc = workspace.CurrentDocument(); 
3

你真正需要的是票據類OLE。

C#Interop類基於Notes COM類。 COM類只能訪問「後端」。即,根對象是Lotus.NotesSession,並且所有類都針對存儲在.NSF文件中的數據。他們無法訪問Notes UI中的任何內容。

Notes OLE類可以訪問根對象Notes.NotesSession的「後端」和根對象Notes.NotesUIWorkspace的「前端」。正如您可以通過該類的名稱所瞭解的那樣,前端類可讓您訪問Notes客戶端UI的元素。

請注意細微差別:OLE類的前綴是「Notes」,而不是前綴「Lotus」。爲COM類。

在舊式VB後期綁定,OLE類實例化這種方式:

CreateObject("Notes.NotesUIWorkspace") 

我不知道如何轉換爲C#。 無論如何,一旦擁有了NotesUIWorkspace對象,當前打開的文檔就可以使用NotesUIWorkspace.CurrentDocument方法。

+1

謝謝理查德,我有一些進步,謝謝你: 類型t = Type.GetTypeFromProgID(「Notes.NotesUIWorkspace」,true); object thisInstance = Activator.CreateInstance(t); – peterpeterson 2013-03-21 08:47:28

相關問題