2013-03-20 119 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

相关问题