Как сделать логи - PullRequest
       30

Как сделать логи

0 голосов
/ 30 сентября 2018

Чтобы объяснить немного больше, у меня есть Main Form, который содержит большой список заданий.
Каждый элемент в списке является экземпляром моего класса, называемого Jobs.
Когда элемент нажимается,открывается еще один Form, в котором пользователь может редактировать информацию о выбранной работе.Я передаю объект задания из Main Form в детали Form и редактирую его через TextBoxes, ComboBoxes и так далее.

Теперь мне нужно определить, какие свойства заданий изменились, и записать это в файл журнала.Я знаю, как записать в файл журнала, но я не знаю, как определить, какие свойства изменились.

Я мог бы написать 30 if операторов, в которых я бы сравнил начальную точку с конечной точкойно у меня есть 30 свойств, и это будет полный беспорядок.

Есть идеи?

1 Ответ

0 голосов
/ 30 сентября 2018

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