获取当前打开的文档

时间:2013-03-20 15:09:38

标签: c# api lotus-notes

我正在试图弄清楚如何通过C#获取Lotus Notes上当前打开的文档,但我不能。即使我在Google上研究了半天,我找不到任何有用的东西。

使用我的代码,我得到了我想要的视图,我想要的数据库等,但我只想获得打开的文档。我试过像IsUIDocOpen这样的东西,但是没有一个完整的集合包含它是真的。

有人知道通过Domino API打开的文档和未打开的文档之间是否有任何不同之处?我的解决方法是获取电子邮件的主题和电子邮件的大小,并比较每个电子邮件和匹配时获取条目ID,然后获取我需要的信息 - 但这需要太长时间,尤其是当收件箱很大时。 / p>

有什么建议吗?

这是我的代码:

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" });

3 个答案:

答案 0 :(得分:3)

您实际需要的是Notes 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 :(得分:2)

如果您使用的是Interop课程,则需要使用NotesUIView.CurrentView.Documents来获得所需内容...请参阅here

答案 2 :(得分:2)

您需要先获取NotesUIWorkspace,然后使用CurrentDocument属性

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