2013-03-20 2 views
1

Я пытаюсь выяснить, как получить открытый документ в Lotus Notes через C#, но я не могу. Несмотря на то, что я исследовал пол дня в Google, я не нашел ничего полезного.Получить текущий открытый документ

С моим кодом я получаю представление, которое я хочу, базу данных, которую я хочу, и т. Д., Но я просто хотел бы получить открытый документ. Я пробовал что-то вроде IsUIDocOpen, но ни одна из полной коллекции не содержит его как истинного.

Знает ли кто-нибудь, существует ли какой-либо другой открытый документ и не открытый документ через Domino API? Мое обходное решение заключается в том, чтобы получить тему электронной почты и размер электронной почты, а также сравнить каждый из них, и когда он соответствует, получить идентификатор записи, а затем получить нужную мне информацию, но это занимает слишком много времени, особенно когда почтовый ящик большой.

Любые предложения?

Вот мой код:

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 или COM-классы Lotus Notes Interop? Если вы используете Domino, он никогда не будет работать: он дает вам доступ к базе данных на вашем сервере Domino, а не программе Lotus Notes. –

+0

Где можно найти классы Lotus Notes Interop COM? Спасибо – peterpeterson

+1

Посмотрите здесь: http://www.ibm.com/developerworks/lotus/library/domino-msnet/index.html. Это для VB.Net, но если я правильно помню, в C# у вас есть доступ к классам-оболочкам в пространстве имен, которые позволяют создавать классы. –

ответ

2

Если вы используете Interop классов, нужно использовать NotesUIView.CurrentView.Documents, чтобы получить то, что вы хотите ... см. here.

+0

Я использую interop.Domino, но я не вижу NotesUIView .. любое другое предложение? – peterpeterson

2

Вам нужно получить NotesUIWorkspace первый, а затем использовать CurrentDocument свойство

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

То, что вы на самом деле нужно, это классы Notes OLE.

Классы C# Interop основаны на классах COM Notes. Классы COM имеют доступ только к «задней части». I.e., корневым объектом является Lotus.NotesSession, и все классы работают с данными, хранящимися в файлах .NSF. У них нет доступа к чему-либо в интерфейсе Notes.

Классы OLE Notes имеют доступ как к «заднему концу», так и к корневому объекту Notes.NotesSession и «front end» с корневым объектом Notes.NotesUIWorkspace. Как вы можете сказать по имени этого класса, это классы переднего плана, которые дают вам доступ к элементам клиентского интерфейса Notes.

Обратите внимание на незначительную разницу: префикс для классов OLE - «Примечания». Вместо префикса «Lotus». для классов COM.

В старом стиле VB позднего связывания, классы OLE инстанцируются таким образом:

CreateObject("Notes.NotesUIWorkspace") 

Я не уверен, как это переводится в C#. Как бы то ни было, если у вас есть объект NotesUIWorkspace, доступный в настоящее время документ доступен с помощью метода NotesUIWorkspace.CurrentDocument.

+1

Спасибо, Ричард, у меня есть некоторый прогресс благодаря вам: Тип t = Тип.GetTypeFromProgID ("Notes.NotesUIWorkspace", true); объект ThisInstance = Activator.CreateInstance (t); – peterpeterson