C# 两个数据表之间的DataRelation-无法将数据绑定到列表框(C.NET 3.5)

C# 两个数据表之间的DataRelation-无法将数据绑定到列表框(C.NET 3.5),c#,visual-studio-2008,data-binding,listbox,datarelation,C#,Visual Studio 2008,Data Binding,Listbox,Datarelation,C.NET 3.5 我有一个SQLite数据库,它有两个表——employees第一列是id INTEGER主键,holidays id INTEGER——表示员工的id;开始日期、结束日期-不言自明 我的表单包含文本框、复选框等来表示员工的详细信息,但我也希望有一个列表框,列出当前所选员工的所有假期 所以我需要一个数据关系,因为列表框应该在两个数据表上的ID需要匹配的时候只显示一个人 var command = new SQLiteCommand("SELECT * FROM

C.NET 3.5

我有一个SQLite数据库,它有两个表——employees第一列是id INTEGER主键,holidays id INTEGER——表示员工的id;开始日期、结束日期-不言自明

我的表单包含文本框、复选框等来表示员工的详细信息,但我也希望有一个列表框,列出当前所选员工的所有假期

所以我需要一个数据关系,因为列表框应该在两个数据表上的ID需要匹配的时候只显示一个人

        var command = new SQLiteCommand("SELECT * FROM employees; SELECT * FROM holidays");
        var connection=new SQLiteConnection(@"data source=C:\employees.db");
        command.Connection = connection;
        SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
        DataSet d = new DataSet();
        adapter.Fill(d);                        

        DataTable employees = d.Tables[0];

        // [...]
        // here I'm databinding my textboxes etc. to various columns 
        // of the employees data table - this works fine, navigation works well etc.
        // [...]

        DataTable holidays = d.Tables[1];            

        DataRelation relation;
        DataColumn master = employees.Columns[0];
        DataColumn slave = holidays.Columns[0];
        relation = new DataRelation("relation", master, slave);
        d.Relations.Add(relation);

        var dsView = holidays.DefaultView;
        listBox1.DisplayMember = "holidays.relation.start"; // <= it wouldn't look good like that of course, but I just want to get the thing to work for now
        listBox1.DataSource = dsView;
但我得到的只是一个列表框,里面装满了一堆System.Data.DataRow 在这个实现中,我试图遵循我在Akadia上找到的教程。。。我哪里出错了?谢谢
首先,您已经命名了变量employees和holidays,但这确实意味着数据集中的表名称已经更改;它们仍然被设置为默认名称,在您的示例中是table和table1。它们通常是桌子,桌子1。。。表 这意味着您的显示成员属性应如下所示:

listBox1.DisplayMember = "table.relation.start";
listBox1.DataSource = d;
    var command = new SQLiteCommand("SELECT * FROM employees; SELECT * FROM holidays");
    var connection=new SQLiteConnection(@"data source=C:\employees.db");
    command.Connection = connection;
    SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
    DataSet d = new DataSet();
    adapter.Fill(d);                        

    DataTable employees = d.Tables[0];

    // [...]
    // here I'm databinding my textboxes etc. to various columns 
    // of the employees data table - this works fine, navigation works well etc.
    // [...]

    DataTable holidays = d.Tables[1];

    DataRelation relation;
    DataColumn master = employees.Columns["id"];
    DataColumn slave = holidays.Columns["employeeid"];
    relation = new DataRelation("relation", master, slave);
    d.Relations.Add(relation);


    listBox1.DisplayMember = "table.relation.start"; // <= it wouldn't look good like that of course, but I just want to get the thing to work for now
    listBox1.DataSource = d;
此外,请确保数据绑定到数据集本身,而不是数据集中的假日表,如下所示:

listBox1.DisplayMember = "table.relation.start";
listBox1.DataSource = d;
    var command = new SQLiteCommand("SELECT * FROM employees; SELECT * FROM holidays");
    var connection=new SQLiteConnection(@"data source=C:\employees.db");
    command.Connection = connection;
    SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
    DataSet d = new DataSet();
    adapter.Fill(d);                        

    DataTable employees = d.Tables[0];

    // [...]
    // here I'm databinding my textboxes etc. to various columns 
    // of the employees data table - this works fine, navigation works well etc.
    // [...]

    DataTable holidays = d.Tables[1];

    DataRelation relation;
    DataColumn master = employees.Columns["id"];
    DataColumn slave = holidays.Columns["employeeid"];
    relation = new DataRelation("relation", master, slave);
    d.Relations.Add(relation);


    listBox1.DisplayMember = "table.relation.start"; // <= it wouldn't look good like that of course, but I just want to get the thing to work for now
    listBox1.DataSource = d;
有了这两个变化,你会发现它是有效的;this.BindingContext应该有助于导航父记录,因为您会注意到此时只显示1组子假日结果

完成修改后的代码,如下所示:

listBox1.DisplayMember = "table.relation.start";
listBox1.DataSource = d;
    var command = new SQLiteCommand("SELECT * FROM employees; SELECT * FROM holidays");
    var connection=new SQLiteConnection(@"data source=C:\employees.db");
    command.Connection = connection;
    SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
    DataSet d = new DataSet();
    adapter.Fill(d);                        

    DataTable employees = d.Tables[0];

    // [...]
    // here I'm databinding my textboxes etc. to various columns 
    // of the employees data table - this works fine, navigation works well etc.
    // [...]

    DataTable holidays = d.Tables[1];

    DataRelation relation;
    DataColumn master = employees.Columns["id"];
    DataColumn slave = holidays.Columns["employeeid"];
    relation = new DataRelation("relation", master, slave);
    d.Relations.Add(relation);


    listBox1.DisplayMember = "table.relation.start"; // <= it wouldn't look good like that of course, but I just want to get the thing to work for now
    listBox1.DataSource = d;

它真的回来了-非常感谢你,马丁!我仍然有启用导航的问题,虽然。。。如何检索主控件和详细控件的通用CurrencyManager,使它们保持协调??我尝试了cam=CurrencyManagerthis.BindingContext[d,table];但只有假期列表框会随着cam.Position的更改而更改其内容。BindingContext[d]?他们都死了。如果我添加textBox1.DataBindings[0].BindingManagerBase.Position=cam.Position;在我的导航按钮的“上一次点击”和“下一次点击”事件处理程序中,它都可以工作,但这有点像黑客