代码之家  ›  专栏  ›  技术社区  ›  Konrad Morawski

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

  •  1
  • Konrad Morawski  · 技术社区  · 16 年前

    C#(.NET 3.5)

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

            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上找到的教程。。。我哪里出错了?谢谢
    1 回复  |  直到 16 年前
        1
  •  2
  •   Martin Booth    16 年前

    首先,您已经命名了变量employees和holidays,但这确实意味着数据集中的表名称已经更改;它们仍然被设置为默认名称,在您的示例中是table和table1(它们通常是桌子,桌子1。。。表1) 这意味着您的显示成员属性应如下所示:

    listBox1.DisplayMember = "table.relation.start";
    

    listBox1.DataSource = d;
    

    有了这两个变化,你会发现它是有效的;this.BindingContext应该有助于导航父记录,因为您会注意到此时只显示1组子(假日)结果。

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

        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;