【问题标题】:DataRelation between two data tables - can't bind data to a listbox (C# .NET 3.5)两个数据表之间的 DataRelation - 无法将数据绑定到列表框 (C# .NET 3.5)
【发布时间】:2011-01-07 02:51:15
【问题描述】:

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 上找到的教程进行操作......我哪里出错了?谢谢

【问题讨论】:

    标签: c# visual-studio-2008 data-binding listbox datarelation


    【解决方案1】:

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

    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;
    

    【讨论】:

    • 它确实会返回过滤后的假期 - 非常感谢 Martin!我仍然在启用导航时遇到问题......如何检索主控件和详细控件的通用货币管理器(以便它们保持协调)?我试过 cam=(CurrencyManager)this.BindingContext[d,"table"];但只有假期列表框会随着 cam.Position 的变化而改变其内容。绑定上下文[d]?他们都死了。如果我添加 textBox1.DataBindings[0].BindingManagerBase.Position = cam.Position;在我的导航按钮的 Prev_Click 和 Next_Click 事件处理程序中..它有效,但这有点 hack
    猜你喜欢
    • 2014-07-19
    • 1970-01-01
    • 2019-01-12
    • 2012-09-06
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多