5

datagridview に埋め込まれた datagridviewcombobox (ドロップダウン メニュー) コントロールから新しい値を選択すると、例外が発生します。コンボボックスは、私のクラスのインスタンスが取り込まれた BindingSource によって取り込まれます。メニューにオプションを適切に表示して選択することはできますが、フォーカスを新しいコントロールに変更すると (私が推測する変更をコミットすると)、例外が表示されます: Invalid Cast from System.String to myclass. スタック トレース (その単語を正しく使用している場合) は、ソースが

System.Windows.Forms.DataGridView.PushFormattedValue が System.Convert.DefaultToType にカスケードする

より明確な説明を以下に示します (長くなって申し訳ありませんが、再現できるようにしたかったのです)。

プロパティのない Occupant という空のクラスがあります (Occupant にも文字列の Name プロパティがある場合に問題が発生するため、そうではありません)。OccupantSource という名前の BindingSource があり、その DataSource は Occupant を指しています。

また、Driver と呼ばれる 1 つの Occupant プロパティを持つ Car と呼ばれるクラスもあります。

私の Form_Load() では、OccupantSource.AddNew() を 2 回呼び出し、CarSource.AddNew() を 1 回呼び出します。

DataGridView コントロールがあり、その DataSource は CarSource (Cars で構成される BindingSource) です。DGV には 1 つの列があり、CarSource 内の車の Driver プロパティを表示します。これは、DataPropertyName がドライバーに設定された DataGridViewComboBoxColumn です。

だから私が望むのは、Datagridview に車の行を表示することです。列の 1 つはドロップダウンして、Occupant の既存のインスタンスからドライバーを選択できるコンボボックスです。しかし、私は例外を取得します。

これは私が誤解しているものですか?クラスのインスタンスを使用して DataGridViewComboBox を作成することはできませんか?

4

1 に答える 1

6

私はまったく同じ問題に遭遇し、Google-fu を何時間も使用して解決しようとして頭を悩ませていました。このリンクは、最終的に私に良い説明を与えてくれました。 http://www.pcreview.co.uk/forums/datagridview-combobox-column-error-listing-objects-t2344961.html

私がそれを修正した方法は、DisplayMember を変更することでした。「this」を返すクラスで「Self」への参照がありました.DisplayMemberとValueMemberの両方にこれを使用していましたが、DisplayMemberのプロパティをToString()するだけだと考えていました。

あなたの説明を読むと、DisplayMember と ValueMember がまったく設定されていない可能性があります。このような場合は、それらを正しく設定してみてください (表示メンバーに「this」への参照を使用しないでください!)、修正される可能性があります。

于 2011-11-02T12:52:42.277 に答える