DataGridViewComboBoxCellはバインディング - 「の値が有効ではありません」
-
19-08-2019 - |
質問
私は、カスタムクラスにDataGridViewのコンボボックス内の別々の細胞に結合しようとすると、
エラーを取得しておきますよDataGridViewComboBoxCell値が有効ではありません。
私は現在、私が持っている辞書からIList<ICustomInterface>
にセルのデータソースを割り当てています。しかし、データソースを設定する際に、ComboBoxCell
設定されていないので、無効な値が選択されている。
私は、例えば、それが本当の値を選択するために取得する方法を把握しようとしていますこのエラーを削除するか、問題を解決するための別の方法を見つけるために与えられているリスト内の0番目の項目。誰もが何か提案はありますか?
解決
私は長くない質問を投稿した後、解決策を見つけることができました。他の誰のために:
問題は、私はセルがデータソースにバインドされたので、それが自動的にソースおよび更新でオブジェクトを見つけるだろうということを期待して、オブジェクトにDataGridViewComboBoxCell.Value
を割り当てるしようとしていたということでした。
これは実際にはそうではなかった、あなたが実際にそれが正しく値を更新し、結合するためのValueMember
財産と同等の値を設定する必要があります。私はほとんどの場合のために働く(むしろインターフェイスインスタンスより)DisplayMember
に値を設定する(セル内のレンダリング方法を制御)interface.ToString()
私は両方のための「名前を」プロパティを使用していたと信じてい<=>と。それから私は私の周りのソースを変更していながら、発生したすべてのDataErrorの例外をキャッチして無視します。
他のヒント
ここに私のシンプルなソリューションです。
ColumnType.ValueType = typeof (MyEnum);
ColumnType.DataSource = Enum.GetValues(typeof (MyEnum));
あなたが行うことができた直後 "のInitializeComponent();"
裁判のAfters時間、私は最終的に機能するソリューションを見つけます。
// Create a DataGridView
System.Windows.Forms.DataGridView dgvCombo = new System.Windows.Forms.DataGridView();
// Create a DataGridViewComboBoxColumn
System.Windows.Forms.DataGridViewComboBoxColumn colCombo = new
System.Windows.Forms.DataGridViewComboBoxColumn();
// Add the DataGridViewComboBoxColumn to the DataGridView
dgvCombo.Columns.Add(colCombo);
// Define a data source somewhere, for instance:
public enum DataEnum
{
One,
Two,
Three
}
// Bind the DataGridViewComboBoxColumn to the data source, for instance:
colCombo.DataSource = Enum.GetNames(typeof(DataEnum));
// Create a DataGridViewRow:
DataGridViewRow row = new DataGridViewRow();
// Create a DataGridViewComboBoxCell:
DataGridViewComboBoxCell cellCombo = new DataGridViewComboBoxCell();
// Bind the DataGridViewComboBoxCell to the same data source as the DataGridViewComboBoxColumn:
cellCombo.DataSource = Enum.GetNames(typeof(DataEnum));
// Set the Value of the DataGridViewComboBoxCell to one of the values in the data source, for instance:
cellCombo.Value = "Two";
// (No need to set values for DisplayMember or ValueMember.)
// Add the DataGridViewComboBoxCell to the DataGridViewRow:
row.Cells.Add(cellCombo);
// Add the DataGridViewRow to the DataGridView:
dgvCombo.Rows.Add(row);
// To avoid all the annoying error messages, handle the DataError event of the DataGridView:
dgvCombo.DataError += new DataGridViewDataErrorEventHandler(dgvCombo_DataError);
void dgvCombo_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
// (No need to write anything in here)
}
それが全てです。
私は同じ問題を抱えています。
私の場合では、溶液は、外部キーテーブルのデータアダプタを埋めるためでした。これは、自動的に充填されていませんでした、これは問題の原因だった。
Page_Load
イベントでます:
Me.TblUserTypesTableAdapter.Fill(Me.DonateDataSet.tblUserTypes)
私は同じ問題を抱えています。 (unbouod)のDataGridで私のコンボボックス列を移入した後、私はのたValueMemberプロパティを設定することで、私の問題を解決しDataGridViewComboBoxColumn
どうやら、ただコンボボックス内のオブジェクトのプロパティToString()
に頼るだけでは十分ではありません。
実際のコード:
/// <summary>
/// Populate the dataGridSplitVolumes data grid with all existing qualifications for the plan.
/// </summary>
/// <param name="bonus"></param>
private void PopulateDataGridSplitVolumes(Bonus_Group bonus)
{
try
{
List<Qualification> qualifications = Qualification.Load(this.groupBonus.PlanID, this.ConnectionString);
foreach (Qualification qual in qualifications)
{
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)this.dataGridSplitVolumes.Columns[0];
col.Items.Add(qual);
}
SplitVolumeGrid_QualificationColumn.ValueMember = "Name";
}
catch (Exception ex)
{
#if DEBUG
System.Diagnostics.Debugger.Break();
#endif
throw ex;
}
}//PopulateDataGridSplitVolumes
DataErrorイベントハンドラを使用し、
private void shahriartableDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
//You don't have to write anything here !
}
とあなたのDisplayMemberとValueMemberでデータ型が同じである必要があり、私の場合、私は両方のためのCOUNTRYNAMEを持っています。すべては私のために正常に動作します... !!
セルにnull値を設定します:
dataGridView.CurrentRow.Cells[NAME].Value = null;
私が行ったように同じくらい苦労していない人の便宜上ます。
あなたがDisplayMemberを設定するコンボを結合する場合(ユーザーが見るもの) そして、ValueMemberで(アプリケーションが得るもの)。
これらを設定した後、あなたは値を設定する必要があり、それが失敗した場所です。 基本的には値の型がValueMemberで同じタイプである必要がある。
あなたの値のメンバーは明らかにそのタイプINTのIDであり、あなたが例えばintにあなたの値を設定する必要があるのであればCell.Value = 1;ます。
私は同じ問題を抱えていました。メッセージは、100%のスポットでした。コンボボックスの値は、のようなものでした:正確な、STARTSWITH ...と私は、連勝単式が(正確ではない)の値を設定しようとしていました。私はDataTable.ReadXml(...)との.xmlファイルからのDataGridViewのためのDataTableを読んでいたので、これは自動的に起こっていました。 .xmlファイル内の値はオフだった。