Matteo Sala Ответов: 1

Метка не обновляется в моей форме, пока ее значение обновляется, C# winform


Я довольно новичок в C#, но теперь мне нужно написать программное обеспечение, которое сообщает о том, что пользователь в данный момент вошел в Outlook. Для этого я использую следующий код:

public string AccountLogged
        {
            get
            {
                try
                {
                    return (Marshal.GetActiveObject("Outlook.Application") as Outlook.Application).Session.Accounts[1].DisplayName;
                }
                catch (Exception)
                {
                    return string.Empty;
                }
            }
        }


затем в приложении.Событие простоя, я обновляю несколько меток (некоторые из них показывают данные из outlook и некоторые другие из других источников), но только одна не обновляется в форме сразу:

lbUserAccount.Text = ComVar.otlConnector.AccountLogged;


При просмотре vars во время отладки все значения верны; даже при открытии и закрытии Outlook несколько раз данные обновляются правильно.
Проблема в том, что метка на форме обновляется немедленно только тогда, когда я назначаю строку значения.Пусто в противном случае это происходит только в том случае, если я нажимаю на форму.

Что я уже пробовал:

- > вместо обновления этой метки из приложения.Вхолостую я попробовал систему.Окна.Формы.Таймер
- > аннулировать
- > обновить
- > Обновление

Matteo Sala

Я попытался максимально изолировать причину неисправности, обнаружив, что проблема вытекает из следующего кода:

return (Marshal.GetActiveObject("Outlook.Application") as Outlook.Application).Session.Accounts[1].DisplayName;

1 Ответов

Рейтинг:
1

jekin77

чтобы обновить метку на вашей форме, просто используйте Control.Вызовите метод типа :

this.lbUserAccount.BeginInvoke((MethodInvoker) delegate() {this.lbUserAccount.Text = ComVar.otlConnector.AccountLogged; });


следующее решение является частью моего кода, который отлично работает для моих нужд

using Outlook = Microsoft.Office.Interop.Outlook;

.
.
.
public string AccountLogged
{
    get
    {
		return GetDefaultOutlookAccount();
    }
}

private string GetDefaultOutlookAccount()
 {
	  Outlook.NameSpace session = null;
      Outlook.Application outlookApp = GetOutlookApplicationObject(out session);
	 
     if (session == null)
         return null;

     string account = string.Empty;
     try
     {
         Outlook.AddressEntry addrEntry = session.CurrentUser.AddressEntry;
         //Exchange server
         if (addrEntry.Type == "EX")
         {
             Outlook.ExchangeUser manager = session.CurrentUser.AddressEntry.GetExchangeUser();
             if (manager != null)
                 account = manager.PrimarySmtpAddress;
         }
         else
         {
             account = session.CurrentUser.Address;
         }
     }
     catch (Exception ex)
     {
         //do something or
	    //throw new Exception(ex);
     }

     return account.ToLower();
 }

private Outlook.Application GetOutlookApplicationObject(out Outlook.NameSpace session)
{
    Outlook.Application app = null;
    session = null;
    // Check whether there is an Outlook process running.           
    if (Process.GetProcessesByName("OUTLOOK").Length > 0)
    {
        try
        {
            //If so, use the GetActiveObject method to obtain the process and cast it to an Application object. 
            app = (Outlook.Application)Marshal.GetActiveObject("Outlook.Application");
            session = app.Session;
        }
        catch (Exception ex)
        {
            //do something or
			//throw new Exception(ex);
        }
    }

    //if  Outlook process not running or exception thrown
    //create a new instance of Outlook and log on to the default profile. 
    if (app == null)
    {
        try
        {
            app = new Outlook.Application();
            session = app.GetNamespace("MAPI");          
            session.Logon("", "", Missing.Value, Missing.Value);
        }
        catch (Exception ex)
        {
            //do something or
			//throw new Exception(ex);
        }
    }

	//now resolve current user
    if (app != null && app.Session != null && session.CurrentUser != null)
        session.CurrentUser.Resolve();

    return app;
}


Matteo Sala

Привет jekin77, спасибо, но для того, чтобы обновить метку на форме, мне все равно нужно нажать на форму.

jekin77

вы пытаетесь использовать invoker in в приложении.Праздное событие ?

вы также можете создать новую метку на своей форме и установить это значение, чтобы устранить проблемы с конструктором

Matteo Sala

да, я попробовал invoker и создать новый ярлык, но все еще не работал. Содержание этой метки обновляется только в том случае, если я предоставляю фокус своей форме. Сумасшедшая вещь заключается в том, что все остальные ярлыки обновляются немедленно, не дожидаясь получения фокуса.

jekin77

попробуй позвонить Аппликтону.Метод DoEvents () после установки значения

https://msdn.microsoft.com/de-de/library/system.windows.forms.application.doevents (v=vs. 110). aspx

вы также можете сохранить значение в переменной temporary и затем установить текст метки :

строка tmpValue = ComVar.otlConnector.AccountLogged;
lbUserAccount.Text = tmpValue;

Matteo Sala

Не работает ни один. метка все еще обновляется только тогда, когда я запускаю приложение, а затем веду себя так, как описано выше

Matteo Sala

да, пробовал также с временным var

jekin77

извини, но у меня больше нет идей. Нужно отладить решение, чтобы решить эту проблему

Matteo Sala

Однако благодаря jekin77