4

をFooのインスタンスにバインドしようとしてDataGridViewComboBoxColumnいますが、グリッドに値を設定するとArgumentException、StringからFooに変換できないというメッセージが表示されました。

var data = (from item in someTable
            select new { Foo = item.foo, Bar = item.Bar }).ToList();
grid.DataSource = data;
column.DataPropertyName = "Foo";
column.DataSource = (from foo in Foo select foo).ToList (); //foo is an instance of Foo
column.DisplayMember = "SomeNameField"; //Foo.SomeNameField contains a description of the instance

私は何かが足りないのですか?複雑なオブジェクトにデータバインドすることは可能ですか?

アップデート:

TypeConverterを実装し、CanConvertFrom、CanConvertTo、ConvertTo、ConvertFromをオーバーライドしました。今私は得ています

FormatException:DataGridViewComboBoxCell値が無効です

何か案は?

4

4 に答える 4

7

DataGridViewComboBoxColumn は、常にコンボボックスの項目リストに可能なすべての値を持つ必要があります。そうしないと、「FormatException: The DataGridViewComboBoxCell value is not valid」がスローされます。

1 つのコンボボックス列から選択された値を取得しようとしている場合は、DataGridView CellParsing イベントを処理し、選択された項目を DataGridView.EditingControl から取得して、編集された列からコントロールを編集するように設定することができます。次に例を示します。

private void dataGridView1_CellParsing(object sender, 
 DataGridViewCellParsingEventArgs e) {
   if (dataGridView1.CurrentCell.OwningColumn is DataGridViewComboBoxColumn) {
       DataGridViewComboBoxEditingControl editingControl = 
                (DataGridViewComboBoxEditingControl)dataGridView1.EditingControl;
       e.Value = editingControl.SelectedItem;
       e.ParsingApplied = true;
   }
}

また、セルの書式設定イベントを処理することで、各セルにオブジェクトを表示する方法をカスタマイズすることもできます。これは、任意のオブジェクトまたはインターフェイスの toString を表示するコードです。

private void dataGridView1_CellFormatting(object sender, 
    DataGridViewCellFormattingEventArgs e) {
        if (e.Value != null) {
            e.Value = e.Value.ToString();
            e.FormattingApplied = true;
        }
    } 

この 2 つのイベントを処理するだけで、ビジネス オブジェクト内のデータを表示および編集するのに十分であり、そのイーザーは型コンバーターを記述します。この作業では、次のように DataGridView とコンボボックス列を設定します。

var data = (from item in someTable
        select new { Foo = item.foo, Bar = item.Bar }).ToList();
grid.DataSource = data;
column.DataPropertyName = "Foo";
column.DataSource = (from foo in Foo select foo).ToList ();

DisplayMember または ValueMember プロパティを設定する必要はありません。コンボボックス データ ソース リストに Foo のすべての可能な値があることを確認してください。

その助けを願っています。

于 2011-08-11T20:21:41.270 に答える
6

可能性のあるピースがありません。

column.DataPropertyName = "Foo";
column.DisplayMember = "SomeNameField"; 
column.ValueMember = "Bar"; // must do this, empty string causes it to be 
                            // of type string, basically the display value
                            // probably a bug in .NET
column.DataSource = from foo in Foo select foo;
grid.DataSource = data;

アップデート:

実際、あなたの質問をもう一度読んだ後、あなたは指摘されたバグに直面していると思います。残念ながら、カスタム TypeDescriptor/TypeConverter/BindingSource を使用せずに、バインドされたオブジェクトを返すようにする方法はありません。

複雑なオブジェクトへのバインドに対する回答。デフォルトではいいえ。私は現在のプロジェクトのために非常に素晴らしいものを書きました。これには、ネストされたすべてのプロパティを返すカスタム TypeDescriptor/TypeConverter/BindingSource の作成が含まれます。別の「バグ」です。「.」は使用できません。メンバーの区切り記号として、代わりに「:」を使用する必要がありました。

于 2009-03-10T16:38:39.397 に答える