2011-08-23 99 views
0

GUI有一个显示事件日志的按钮,该日志只是具有丰富文本框的另一个表单。当字符串变量发生变化时事件未被触发

我正在做一个事件日志,告诉用户发生了什么事情。我遇到的问题是,我不知道为什么设置的事件处理程序在字符串更改时未被触发。基本上,这个表单有一个文本框,文本框被设置为一个名为'activity'的字符串。这个字符串被添加到关于状态和错误的各种消息中。

但是,当字符串与其他消息连接时,事件不会被触发,并且不会自动更新。我正在寻找这些事件发生时的实时更新。现在,我可以关闭表单,然后重新打开它来重新加载活动字符串,这很有效,但是有人可以告诉我为什么我设置的事件没有被触发?以下是代码: 第一位是我启动的新窗体。第二个位是具有字符串活动的类。

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

(你不必使用过程中的属性getter - 只有这很重要二传手)

+0

谢谢乔恩,总是一个救生员,但tafoo85击败你的答案,我虽然+1。 ^^ –

+0

@ tf.rz:其实我认为我的回答是在tafoo85's之前17秒(将鼠标悬停在“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

感谢您的回答!傻我.. –

相关问题