1

まず、DataGridView/BindingSource/DataRelation などについて学習しようとしています。すでにいくつかのチュートリアルを読み、トピックに関する情報を収集しています。これまでのところ、基本は理解できたと思います。今は、学んだことを試してみようとしています。

これまでのところ、このチュートリアルのコードで遊んでいます: https://msdn.microsoft.com/en-us/library/c12c1kx4%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang =csharp#コードスニペット-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

commandbuilder に影響を与える方法の例が要求されたので、myView または結合されたテーブルの代わりに myTable への更新をビルドします。
変数 Table は、「select * from myView」または「select B.field1, C.field2 from B join C on ...」で埋められた実際の DataTable です 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 に答える