1

C# (.NET 3.5)

我有一个带有两个表的 SQLite 数据库 - 员工(第一列是 id INTEGER PRIMARY KEY)和假期(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 上找到的教程进行操作......我哪里出错了?谢谢
4

1 回答 1

2

首先,您已将变量命名为 employees 和 holiday,但这确实意味着数据集中的表已更改名称;它们仍设置为默认名称,在您的情况下为 table 和 table1。(它们通常是 table、table1 ... tableN)这意味着您的显示成员属性应如下所示:

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

此外,请确保您将数据绑定到数据集本身而不是数据集中的假期表,如下所示:

listBox1.DataSource = d;

通过这两个更改,您应该会发现它有效;this.BindingContext 应该有助于导航父记录,因为您会注意到当时只显示一组子(假日)结果。

完整修改代码如下:

    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;
于 2010-01-20T05:33:10.290 回答