3

DataGridViewの場合、1つのテーブルから多数の列を表示しています。このテーブルには、別のテーブルのアイテムを指す列があります。すでにお察しのとおり、ItemIDの代わりに2番目のテーブルのテキスト値を1列のグリッドに表示したいと思います。これを行う方法をネット上で正しい例を見つけることができませんでした。

データベースに2つのテーブルがあると仮定しましょう。

テーブルユーザー:

UserID UserName UserWorkplaceID
  1     Martin        1
  2     John          1
  3     Susannah      2
  4     Jack          3

テーブルワークプレイス:

WorkplaceID WorkplaceName
     1        "Factory"
     2        "Grocery"
     3        "Airport"

型指定されていないデータセットdsUsersが1つ、バインディングソースが1つ、データセットを埋めるためbsUsersに2つあります( 、)。DataAdaptersdaUsersdaWorkplaces

私が実行しているコード:

daUsers.Fill(dsUsers);
daWorkplaces.Fill(dsUsers);
bsUsers.DataSource = dsUsers.Tables[0];
dgvUsers.DataSource = bsUsers;

この時点でdgvUsers、UserID、UserName、UserWorkplaceIDの3つの列が表示されます。ただし、UserWorkplaceIDと値1、2、3の代わりに、「Factory」、「Grocery」などを表示したいのですが...

そこで、「WorkplaceName」という別の列を追加dgvUsersし、コードでそれを新しく作成されたリレーションにバインドしようとしています。

dsUsers.Relations.Add("UsersWorkplaces", dsUsers.Tables[1].Columns["WorkplaceID"], dsUsers.Tables[0].Columns["UserWorkplaceID"]);

WorkplaceName.DataPropertyName = "UsersWorkplaces.WorkplaceName";

残念ながら、それは機能しません。リレーションはエラーなしで作成されますが、プログラムの実行後、この列のフィールドは空になります。

私が間違っていることは何ですか?

また、DataGridViewのLookUpコンボボックスを使用してUserWorkplaceIDを変更できる例についてもお聞きしたいと思いますが、数値の代わりに、WorkplaceNameの下にあるtex値が表示されます。

御時間ありがとうございます。

4

3 に答える 3

2

DataTableDataGridView を2つの異なるインスタンスに同時にバインドしているように見える、あなたが望むことを正確に行うことができるかどうかはわかりません。クラスがそれをサポートしているとは思わないDataGridView-またはサポートしている場合、それは私が見たことのない忍者スタイルの動きです.

MSDNによると、おそらくCellFormattingDataGridView でイベントを使用し、フォーマットされているセルがいつルックアップ列にあるかを確認してから、他のテーブルの値を置き換えることができます。WorkplaceName 列にバインドされていない列を使用し、UserWorkplaceID 列を非表示にしてから、CellFormatting イベント ハンドルを実装して行の値を検索します。次に例を示します。

private void dgv_CellFormatting(object sender, 
    DataGridViewCellFormattingEventArgs e)
{
    if (dgv.Columns[e.ColumnIndex].Name.Equals("WorkplaceName")
    {
        // Use helper method to get the string from lookup table
        e.Value = GetWorkplaceNameLookupValue(
            dataGridViewScanDetails.Rows[e.RowIndex].Cells["UserWorkplaceID"].Value);
    }
}

多くの行が表示されている場合、これはパフォーマンスに影響を与える可能性がありますが、おそらくそれを機能させる適切な方法です。

これが気に入らない場合は、DataTable.Merge()メソッドを使用してルックアップ テーブルをメイン テーブルにマージしてください。私の ADO.NET ブックの 1 つをざっと見てみると、これは機能するはずですが、試したことはありません。しかし、これが以前に提案されたアイデアに近すぎるかどうかはわかりません。

ルックアップ コンボボックスに関する 2 番目の質問については、適切な注意を引くために別の質問に投稿する必要があります。

于 2010-07-26T00:39:37.200 に答える
1

代わりにSQLにその仕事をさせることができます。結合を使用して、IDの代わりにWorkplace名を持つテーブルを返し、そのテーブルをデータセットに出力して、代わりに使用します。

例えば。

SELECT A.UserID, A.UserName, B.WorkplaceID
   FROM Users A 
   JOIN Workplaces B ON A.UserWorkplaceID = B.WorkplaceID

次に、その出力を使用してdsUsersを埋めます。

于 2010-07-25T17:28:28.713 に答える