4

これに関する投稿がいくつかありますが、何時間も検索した後でも、必要なものが見つかりません。

次の投稿の答えは、私が望むものをほとんど手に入れます: DataGridView の外部キーのコンボボックス

質問1:

製品に多くのライセンスがある例から離れて、私のデータベース マッピングはすべて多対 1 の関係です。これは、私のライセンス クラスが製品クラスへの参照を保持していることを意味します。License クラスには ProductId のプロパティがありません。これは、Product 参照を介して取得できるためです。UI でのバインディングを簡単にするためだけに、Product への参照と ProductId プロパティの両方を使用して License クラスを台無しにしたくありません。

DataPropertyNameこのため、 を Id フィールドに設定できません。次のようなクラス参照名である必要があります。

DataGridViewComboBoxColumn dataGridViewComboBoxColumn = 
(DataGridViewComboBoxColumn)myDataGridView.Columns("LicenseComboBoxColumn");

dataGridViewComboBoxColumn.DataPropertyName = "License"; // not LicenseID

****更新**** 次のように DataPropertyName として Product.Id を指定することで、ProductId プロパティを作成せずにこれを部分的に機能させることができました。

dataGridViewComboBoxColumn.DataPropertyName = "License.Id";

ただし、そうすると、データバインディングが壊れて、セル値を手動で取得して設定する必要がありました。

DataGridView セルへのバインディングに関する投稿も見ましたが、それを行うとデータバインディングが壊れ、データソース自体が更新されません。

// populate the combo box with Products for each License

foreach (DataGridViewRow row in myDataGridViewProducts.Rows) 
{
    IProduct myProduct = row.DataBoundItem as IProduct;
    DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)row.Cells("myProductCol");
    cell.DataSource = getListOfILicenseObjectsFromDao(myProduct.Id);
    cell.Value = myProduct.License.Id;
}

やり方が間違っているのかもしれませんし、やり方が違うのかもしれません。誰でもここで助けることができますか?

質問2:

製品ごとに異なるライセンスのリストを表示するにはどうすればよいですか? つまり、ライセンスのコンボボックス リストは、グリッド内の製品ごとに異なります。データバインディングを使用してこれを行いたいので、自分で値を取得して設定する必要はありません。

4

1 に答える 1

4

私は自分で答えを見つけました。少し前にこれと同じ問題があり、掘り起こした古いコードで解決策を見つけました。解決策は、コンボボックスでデータバインドしたいオブジェクトに Self プロパティを追加し (上記の例では License クラスになります)、そのプロパティを次のように ValueMember として使用することでした。

foreach (DataGridViewRow row in myDataGridViewProducts.Rows) 
{
    IProduct myProduct = row.DataBoundItem as IProduct;
    DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)row.Cells("myProductCol");
    cell.DataSource = getListOfILicenseObjectsFromDao(myProduct.Id);
    cell.DataPropertyName = "License";        
    cell.DisplayMember = "Name";
    cell.ValueMember = "Self"; // key to getting the databinding to work
    // no need to set cell.Value anymore!
}

License クラスは次のようになります。

Public class License
{
    public string Name
    {
        get; set;
    }

    public ILicense Self
    {
        get { return this; }
    }

    // ... more properties
}

確かに、Self という名前のプロパティを使用して Business クラスを「いじくりまわす」必要がありましたが、IMO の Product クラスで License と LicenseId プロパティの両方を参照するよりもはるかに優れています (プログラマの混乱が少なくなります)。さらに、手動で値を取得して設定する必要がないため、UI コードをはるかにシンプルに保ちます。データバインドするだけです。

于 2011-05-16T15:50:33.307 に答える