基于第3表的信息的主要细节关系

时间:2015-09-14 14:07:29

标签: c# data-binding datagridview datarelation

为了解决这个问题,我试图了解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中调用表B中的连接,但我认为可以使用DataRelation和BindingSource。表A和表C之间的关系不是问题,但对表B来说似乎不可能。

有没有任何方法可以实现我的目标,或者这样只是错误?任何有关正确方向的建议或指示都会很高兴。

1 个答案:

答案 0 :(得分: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);
            }
        }
    }
}