вопрос дизайна c # - автономное приложение с графическим интерфейсом - PullRequest
0 голосов
/ 03 августа 2009

Приятно видеть, сколько знаний у людей здесь, это сокровище места. Я видел себя пишущим код для событий DataGridView и использующим DataSource для подготовленного бэкэндом объекта DataTable.

Иногда пользователь может удалять строки, обновлять их и т. Д., И базовые данные снова будут нуждаться в проверках правильности.

Давайте предположим, что у нас есть человек класса

class Person {
    public string FirstName { get; set; }       
}

Допустим, некоторая другая часть кода имеет дело с созданием массива Person.

class Processor {
       public static Person[] Create()
       {
           ....
           ....
           return person[];
       }
}

И эта информация появится в DataGridView для просмотра пользователем. Я пробовал что-то вроде этого:

public static DataTable ToTable(List<Person> list)
{   ...   }

И имел этот метод в классе Person ... которому, я думаю, он бы принадлежал. Затем я привязал бы DataGridView к этой DataTable, и пользователь затем увидит эти данные и выполнит свои задачи.

Но я подумал об использовании BindingList <>, о котором я пока не очень разбираюсь ... Будет ли у меня такая же возможность сортировки DataGridView, как у DataTable в качестве источника данных? Будет ли BindingList реализован контейнерным классом, таким как PersonCollection, или класс Person будет реализован сам по себе? Я хотел бы запустить некоторые события, чтобы иметь возможность корректно изменять коллекцию без необходимости сбрасывать источники данных и т. Д. Там, где пользовательский опыт действительно может быть затронут.

Я понимаю, что изменение DataSource DataTable - это хороший способ. Но иногда мне нужно запускать методы в соответствующем классе, на который ссылается эта конкретная строка, и иметь некрасивый дополнительный скрытый столбец, который будет содержать ссылку на существующий объект где-то еще (ссылка Person).

Если вы, ребята, знаете лучшее дизайнерское решение, я был бы очень рад его услышать. Заранее спасибо,

PS. Прочитав «Прагматичный программист», я просто не могу перестать критически думать о коде!

Лев Б.

Ответы [ 2 ]

2 голосов
/ 03 августа 2009

Создание класса бизнес-объекта. Реализуйте INotifyPropertyChanged. Посмотрите на код ниже:

public class Employee:INotifyPropertyChanged
    {
        public Employee(string Name_, string Designation_, DateTime BirthDate_)
        {
            this.Name = Name_;
            this.Designation = Designation_;
            this.BirthDate = BirthDate_;
        }


        #region INotifyPropertyChanged Members
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion

        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

        [DisplayName("Employee Name")]
        public string Name
        {
            get { return this._Name; }

            set
            {
                if (value != this._Name)
                {
                    this._Name = value;
                    NotifyPropertyChanged("Name");
                }
            }
        }
        private string _Name = string.Empty;

        [DisplayName("Employee Designation")]
        public string Designation
        {
            get { return this._Designation; }

            set
            {
                if (value != this._Designation)
                {
                    this._Designation = value;
                    NotifyPropertyChanged("Designation");
                }
            }
        }
        private string _Designation = string.Empty;

        public DateTime BirthDate
        {
            get { return this._BirthDate; }

            set
            {
                if (value != this._BirthDate)
                {
                    this._BirthDate = value;
                    NotifyPropertyChanged("BirthDate");
                }
            }
        }
        private DateTime _BirthDate = DateTime.Today;

        [DisplayName("Age")]
        public int Age
        {
            get
            {
                return DateTime.Today.Year - this.BirthDate.Year;
            }
        }
  }

Создайте свою собственную коллекцию:

public class EmployeeCollection:BindingList<Employee>
    {
        public new void  Add(Employee emp)
        {
            base.Add(emp);
        }

        public void SaveToDB()
        {
           //code to save to db
        }
    }

Установить источник данных:

 _employeeStore = new EmployeeCollection(); 
this.dataGridView1.DataBindings.Add("DataSource", this, "EmployeeStore");

Теперь, если вы хотите добавить сотрудника в свое представление данных,

Employee employee = new Employee(textBoxName.Text, textBoxDesignation.Text, dateTimePicker1.Value);            
_employeeStore.Add(employee);

Это очень чисто. Вы просто играете с бизнес-объектом и не трогаете пользовательский интерфейс.

1 голос
/ 03 августа 2009

Не прочитал ваш вопрос полностью, но вы, возможно, захотите взглянуть на мой проект ModelShredder , который предоставляет удобный и быстрый метод ToDataTable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...