将master / detail绑定到两个datagridview中

时间:2012-06-02 06:14:36

标签: winforms binding datagridview master-detail

我用C #Windows表单创建了一个类来表示我的数据库。 它具有使用List<>

的主/详细信息

包含培训(主)和TrainingDetails(详细信息)的员工资料的记录

现在,我如何将其显示为2 datagridview,每当我从第一个datagridview选择“Training”时,它将在第二个datagridview上显示详细信息。

每当用户从第一个datagridview中选择一个新项时,很容易更改第二个datagridview的数据源。但我想知道它是如何专业地完成的。

同样保存是一种痛苦,我想迭代数据流并保存它但是这意味着我必须知道数据已被更新,插入和删除。

请帮帮我。我是新手。

1 个答案:

答案 0 :(得分:7)

BindingSources会为您解决此问题。

例如说我有两个班级,教师和学生:

public class Teacher
{
    private List<Student> _students = new List<Student>();
    public string Name { get; set; }
    public string Class { get; set; }
    public List<Student> Students { get { return _students; } }
}

public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
}

然后,您可以创建一个代表主/细节情况的教师列表:

List<Teacher> teachers = new List<Teacher>();
Teacher t = new Teacher();
t.Name = "Mr. Smith";
t.Class = "A1";
teachers.Add(t);

Student s = new Student();
s.Name = "Jimmy Jones";
s.Age = 6;            
t.Students.Add(s);

s = new Student();
s.Name = "Jane Doe";
s.Age = 5;
t.Students.Add(s);

t = new Teacher();
t.Name = "Ms. Allen";
t.Class = "B3";
teachers.Add(t);

s = new Student();
s.Name = "Sally Student";
s.Age = 7;
t.Students.Add(s);

在我的表单上,我有两个DataGridViewsteachersDataGridViewstudentsDataGridView以及两个绑定来源teachersBindingSourcestudentsBindingSource

我把所有东西都连接起来:

    teachersBindingSource.DataSource = teachers;

    studentsBindingSource.DataSource = teachersBindingSource;
    studentsBindingSource.DataMember = "Students";

    teachersDataGridView.DataSource = teachersBindingSource;
    studentsDataGridView.DataSource = studentsBindingSource;

并且好像通过魔术在表单上运行时从教师网格中选择项目会改变学生网格。


为了管理插入,更新和删除,您需要自己实现某种类型的更改跟踪(或使用ORM,如Entity Framework或nHibernate)。这个主题应该得到自己的问题,所以请阅读这些技术(并查看我喜欢的博客文章),并在遇到一些具体问题时再回来。


对于这个答案,我从this优秀的帖子中大量借用 - 我给出的例子是完整的并且避免了作者示例中的很多复杂性,但最终你可能想要至少知道一切他讨论过。下载他的演示并看看。