2011-08-23 2 views
0

GUI имеет кнопку, которая отображает журнал событий, который представляет собой еще одну форму с богатым текстовым полем.Событие не запускается при изменении строковых переменных

Я делаю журнал событий, который сообщает пользователю, что происходит. Проблема в том, что я не знаю, почему обработчик событий, который я создал, не запускается при изменении строки. В принципе, эта форма имеет текстовое поле, а текстовое поле имеет строку с названием «активность». Эта строка добавляется к различным сообщениям о статусе и ошибках.

Однако, когда строка получает конкатенирование с другими сообщениями, событие не запускается, и оно не будет автоматически обновляться. Я ищу обновление в режиме реального времени, поскольку эти события происходят. Прямо сейчас я могу закрыть форму, а затем снова открыть ее, чтобы заставить ее снова загрузить строку активности, и это работает, но может ли кто-то пролить свет на то, почему настроенное событие не запускается? Вот код: Первый бит - это новая форма, которую я запускаю. Второй бит - это класс со строковой активностью.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace StatusLog 
{ 
    public partial class StatusLogForm : Form 
    { 
     public StatusLogForm() 
     { 
      InitializeComponent(); 
     } 
     private StatusLog statuslog = StatusLog.Instance; 


     private void StatusLogForm_Load(object sender, EventArgs e) 
     { 
      statuslog.ActivityChanged += new EventHandler(statuslog_ActivityChanged); 
      richTextBox1.Text = statuslog.Activity; 
     } 

     void statuslog_ActivityChanged(object sender, EventArgs e) 
     { 
      richTextBox1.Text = statuslog.Activity; 
     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using GDCanada.LCSS.VMF.ProtoVmf; 

namespace StatusLog 
{ 
    public class StatusLog 
    { 
     private static StatusLog instance; 
     private StatusLog() 
     { 
     } 

     public static StatusLog Instance 
     { 
      get 
      { 
       if (instance == null) 
       { 
        instance = new StatusLog(); 
       } 
       return instance; 
      } 
     } 

     public enum LogType 
     { 
      Error, 
      Status, 
      Information, 
      Warning, 
     } 

     public event System.EventHandler ActivityChanged; 
     private string activity = "Activity:"; 
     public string Activity 
     { 
      get 
      { 
       return activity; 
      } 
      set 
      { 
       activity = value; 
       if (this.ActivityChanged != null) 
       { 
        this.ActivityChanged(this, new System.EventArgs()); 
       } 
      } 
     } 
     void activitychanged(object sender, System.EventArgs e) 
     { 
     } 

     public void Log(string message, LogType type) 
     { 
      activity = activity + "\n" + type.ToString() + ": " + message; 
     } 
    } 
} 

Я добавляю строку через функцию «Журнал». Любая помощь очень ценится, спасибо! Приношу свои извинения, если я пропустил какую-либо информацию. Я буду рад предоставить любые, если потребуется.

-tf.rz .NET 3.5 SP1

ответ

5

Посмотрите на этот метод:

public void Log(string message, LogType type) 
{ 
    activity = activity + "\n" + type.ToString() + ": " + message; 
} 

вы изменяете переменная непосредственно - который ничего не делает, но изменить значение переменной.

Если вы хотите, чтобы код свойства, чтобы выполнить (и, таким образом поднять событие) вы должны сделать:

public void Log(string message, LogType type) 
{ 
    // Note use of property 
    Activity = Activity + "\n" + type.ToString() + ": " + message; 
} 

(Вы не должны использовать свойство геттер конечно - это только сеттер, что важно .)

+0

Спасибо Jon, всегда спасатель, но tafoo85 победил вас до ответа, я сделал +1, хотя. ^^ –

+0

@ tf.rz: На самом деле я думаю, что мой ответ был за 17 секунд до того, как tafoo85 (наведите указатель мыши на «ответил XX минут назад»), но это не проблема :) –

+0

LOL, ну тогда. = P –

4
public void Log(string message, LogType type) 
{ 
     activity = activity + "\n" + type.ToString() + ": " + message; 
} 

Вы должны вызвать Свойство класса, а не переменную-член.

public void Log(string message, LogType type) 
{ 
     Activity = Activity + "\n" + type.ToString() + ": " + message; 
} 
+0

Спасибо за ответ! дурак я.. –

Смежные вопросы