1

首先,我正在尝试了解 DataGridView/BindingSource/DataRelation 等。我已经阅读了一些教程并收集了有关该主题的信息。到目前为止,我认为我了解了基础知识,现在我正在尝试用我学到的东西进行实验。

到目前为止,我正在使用本教程中的代码: https ://msdn.microsoft.com/en-us/library/c12c1kx4%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang =csharp#code-snippet-1

在我的项目中有 3 个表:

Table A    
    A_id    eng_word
    0         dog
    1         cat

Table B
    B_id    ger_word
    0        Hund
    1        Katze
    2        Maus

Table C (Relation)
    A_id    B_id
    0       0
    0       1
    1       1
    1       2

我的目标是必须为每个表 A 和表 B 使用 BindingSource 和 DataRelations 的 DataGridViews,这样当我单击 DataGridView A 中的条目时,会显示表 B 中的所有元素,这可能是根据表 C 的翻译。

        DataRelation relation = new DataRelation("Relation",
            data.Tables["tableA"].Columns["A_id"],
               data.Tables["tableB"].Columns["B_id"]);
        data.Relations.Add(relation);

        bindingSourceA.DataSource = data;
        bindingSourceA.DataMember = "tableA";

        bindingSourceB.DataSource = bindingSourceA;
        bindingSourceB.DataMember = "Relation";

如果不必在表 B 和表 C 上调用连接,这显然是行不通的,但我认为这可能与 DataRelation 和 BindingSource 一起使用。从表 A 到表 C 的关系不是问题,但对我来说,持续到表 B 似乎是不可能的。

是否有任何方法可以实现我的目标,或者这种方式只是错误的?任何正确方向的建议或指示将不胜感激。

4

1 回答 1

0

根据要求提供如何影响命令构建器的示例,因此它构建了对 myTable 的更新,而不是对 myView 或连接的表。
变量 Table 是实际的 DataTable 填充了“select * from myView”或“select B.field1, C.field2 from B join C on ...”
确保 myTable 中的每个字段都存在于 myView

using (SqlConnection connection = new SqlConnection(_ConnectionString))
{
    connection.Open();
    using (SqlDataAdapter adapter = new SqlDataAdapter())
    {
        using (SqlCommand command = new SqlCommand())
        {
            using (SqlCommandBuilder builder = new SqlCommandBuilder())
            {
                adapter.SelectCommand = command;// Command;
                adapter.SelectCommand.Connection = connection;
                builder.DataAdapter = adapter;

                // here I let the command builder think that the table is myTable in stead of myView
                adapter.SelectCommand.CommandText = "select * from myTable";
                adapter.UpdateCommand = builder.GetUpdateCommand(true).Clone();
                adapter.DeleteCommand = builder.GetDeleteCommand(true).Clone();

                adapter.Update(Table);
            }
        }
    }
}
于 2015-09-15T09:16:11.427 回答