很高兴看到人们在这里拥有多少知识,这是一个地方的宝藏。 我已经看到自己为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。
答案 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方法