1

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

通过我的代码,我得到了我想要的视图、我想要的数据库等,但我只想得到打开的文档。我尝试了类似 IsUIDocOpen 的方法,但没有一个完整的集合包含它是真的。

有人知道通过 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" });
4

3 回答 3

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方法获得。

于 2013-03-21T01:27:23.047 回答
2

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

NotesUIWorkspace workspace = new NotesUIWorkspace();
NotesUIDocument uidoc = workspace.CurrentDocument();
于 2013-03-20T16:46:56.627 回答
2

如果您使用的是互操作类,您需要使用这些类NotesUIView.CurrentView.Documents来获得您想要的……请参见此处

于 2013-03-20T15:20:19.937 回答