【问题标题】:How to make logs如何制作日志
【发布时间】:2019-03-05 17:22:37
【问题描述】:

为了进一步解释,我有一个 Main Form,其中包含大量工作列表。
列表中的每一项都是我的名为 Jobs 的类的一个实例。
单击一个项目时,另一个Form 正在打开,用户可以在其中编辑所选作业的信息。我将一个作业对象从 Main Form 传递给 details Form 并通过 TextBoxesComboBoxes 等进行编辑。

现在我需要检测作业的哪些属性已更改并将其写入日志文件。我知道如何写入日志文件,但我不知道如何检测哪些属性已更改。

我可以写 30 个 if 语句,在其中我将比较起点和终点,但我有 30 个属性,这将是一团糟。

有什么想法吗?

【问题讨论】:

  • 你考虑过使用事件吗? Winforms 中的文本框和组合框具有“TextChanged”等事件,您可以使用它们。

标签: c# winforms events logging jobs


【解决方案1】:

看看 INotifyPropertyChanged:https://docs.microsoft.com/en-us/dotnet/framework/winforms/how-to-implement-the-inotifypropertychanged-interface

示例

using log4net;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private static readonly ILog Logger = LogManager.GetLogger(typeof(Form1).FullName);
        public PersonViewPresenter Presenter { get; private set; }
        public Form1()
        {
            InitializeComponent();
            Presenter = new PersonViewPresenter();
            Presenter.PropertyChanged += Presenter_PropertyChanged;
            AddBindings();
        }

        private void Presenter_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            Logger.Info($"Property changed {e.PropertyName}");
        }

        private void AddBindings()
        {
            _firstnameTextbox.DataBindings.Add(new Binding(nameof(_firstnameTextbox.Text), Presenter, nameof(Presenter.FirstName), false, DataSourceUpdateMode.OnValidation));
            _lastnameTextBox.DataBindings.Add(new Binding(nameof(_lastnameTextBox.Text), Presenter, nameof(Presenter.LastName), false, DataSourceUpdateMode.OnValidation));
        }
    }
}

ViewPresenter 实施

using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace WindowsFormsApp1
{
    public class PersonViewPresenter : ViewPresenterBase
    {
        private string _lastName;
        private string _firstName;

        public string FirstName
        {
            get => _firstName; set
            {
                if (_firstName != value)
                {
                    _firstName = value;
                    NotifyPropertyChanged();
                }
            }
        }

        public string LastName
        {
            get => _lastName; set
            {
                if (_lastName != value)
                {
                    _lastName = value;
                    NotifyPropertyChanged();
                }
            }
        }
    }

    public abstract class ViewPresenterBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected void NotifyPropertyChanged([CallerMemberName]string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

【讨论】:

  • 这肯定可以解决问题。也许,添加一个示例实现,以便在此处可见。
  • 别忘了Presenter.PropertyChanged -= Presenter_PropertyChanged;OnDispose()
猜你喜欢
  • 2011-12-03
  • 2018-12-11
  • 2011-10-02
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多