c#设计问题 - 独立的GUI应用程序

时间:2009-08-03 15:23:54

标签: c# user-interface

很高兴看到人们在这里拥有多少知识,这是一个地方的宝藏。 我已经看到自己为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&lt;&gt;我还没有受过如此教育..我是否仍然具有与DataTable作为DataSource一样对DataGridView进行排序的能力? BindingList是由像“PersonCollection”这样的容器类实现的,还是Person类实现自己?我想发布一些事件,以便能够以干净的方式修改集合,而无需重置数据源等。用户体验真的会受到影响。

我知道修改DataSource DataTable是一种好方法。但有时我需要在该特定行引用的相应类中触发方法,并且有一个丑陋的额外隐藏列,它将在其他地方保存对现有对象的引用(Person引用)。 / p>

如果你们知道一个更好的设计解决方案,我会非常乐意听到它。 提前谢谢,

PS。在阅读“实用程序员”之后,我就不能停止批判性思考代码了!

Leo B。

2 个答案:

答案 0 :(得分:2)

创建业务对象类。实现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);

这很干净。您只需使用业务对象,而不要触摸UI。

答案 1 :(得分:1)

没有完全读过你的问题,但你可能想看看我的项目ModelShredder,它提供了方便快捷的ToDataTable方法