Событие не запускается при изменении строковой переменной - PullRequest
0 голосов
/ 24 августа 2011

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 24 августа 2011

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

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

(Конечно, вам не обязательно использовать метод получения свойств - важен только метод установки.)

4 голосов
/ 24 августа 2011
 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;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...