2009-03-17 199 views
23

私は、カスタムクラスをDataGridViewの中に別のコンボボックス細胞に結合しようとしている、とDataGridViewComboBoxCellバインディング - 「値が有効ではありません」

DataGridViewComboBoxCell値が有効な

ないエラーを取得しておきますよ

私は現在、私が持っている辞書からIList<ICustomInterface>にセルのデータソースを割り当てています。ただし、データソースを設定すると、ComboBoxCellのインデックスは設定されていないため、無効な値が選択されています。

私は実際の値を選択する方法を理解しようとしています。このエラーを取り除くために与えられたリスト内の0番目の項目、または問題を解決するための別の方法を見つけます。誰でも何か提案がありますか?

+1

コードを投稿できますか? – JaredPar

答えて

26

質問を投稿した後も解決策を見つけることができませんでした。他の人のために:

問題は、私がオブジェクトにDataGridViewComboBoxCell.Valueを割り当てようとしていたことです。セルがデータソースにバインドされ、自動的にソースと更新でオブジェクトが見つかるためです。

実際にはそうではありませんでしたが、実際に値とバインディングを正しく更新するには、ValueMemberプロパティの値と同じ値を設定する必要があります。私はValueMemberDisplayMember(セルのレンダリング方法を制御する)の両方にプロパティ 'Name'を使用しているので、(インターフェイスインスタンスではなく)interface.ToString()に値を設定することが大部分の場合に有効です。次に、私はソースを変更している間に発生するDataErrorの例外をすべてキャッチして無視します。

+3

これを跨いで他の人がいる場合は、ValueMemberプロパティがセルの値と等しい必要があることを意味します。 - DisplayMemberは、表示したい対応するフィールドです。 – Chris

3

数時間の試行の後、私は最終的に動作する解決策を見つけました。

// 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) 
} 

これがすべてです。

+1

@NaSo覚えておいてください!あなたはそれを無視しないで、問題を治す必要があります。ところで、あなたは 'cellCombo.DataSource'をバインドしました、それはまったく間違っています。実際に 'DataGridViewComboBoxCell.DataSource'は' DataGridViewComboBoxColumn.DataSource'を設定すると自動的にバインドされます – Rzassar

2

私は同じ問題を抱えていました。

私の場合、ソリューションは外部キーテーブルのデータアダプタを満たすことでした。これは自動的に満たされていなかったため、これが問題の原因でした。 Page_Loadイベントで

Me.TblUserTypesTableAdapter.Fill(Me.DonateDataSet.tblUserTypes) 
1

私は同じ問題を抱えています。私のComboBoxの列を(unbouod)DataGridに入れた後、私はDataGridViewComboBoxColumnのValueMemberプロパティを設定して問題を解決しました。 どうやら、ComboBox内のオブジェクトのToString()プロパティに頼っているだけでは不十分です。

実際のコード:「あなただけの後のことを行うことができます

はここで列挙型

ColumnType.ValueType = typeof (MyEnum); 
ColumnType.DataSource = Enum.GetValues(typeof (MyEnum)); 

を使用して、私のシンプルなソリューションです

dataGridView.CurrentRow.Cells[NAME].Value = null; 
0

は、セルにNULL値を設定します。 InitializeComponent(); "

9

/// <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  
+0

私の場合は本当にうまく動作します、ありがとう! – peterkodermac

+0

'MyEnum'の値は何でしょうか? –

+0

あなたのデータにマッチするコンボボックス内の列挙型。 – Sauleil

0

私のように苦労していない人のために。

コンボをバインドするときは、DisplayMember(ユーザーに表示されるもの) とValueMember(アプリケーションが取得する内容)を設定しています。

これらを設定したら、値を設定する必要があります。これが失敗する場所です。 基本的に、値のTYPEはValueMemberと同じTYPEである必要があります。

したがって、値メンバーが明らかにINT型のIDであり、値をint(たとえばCell.Value = 1;)に設定する必要がある場合。

1

使用DataErrorイベントハンドラ、

private void shahriartableDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e) 
     { 
      //You don't have to write anything here ! 
     } 

とあなたのDisplayMemberとValueMemberでのデータ型は、私の場合、私は両方のためのCOUNTRYNAMEを持って、同じである必要があります。すべてが私のためにうまくいく... !!

0

私は同じ問題を抱えていました。メッセージは100%のスポットになっていました。コンボボックスの値は、Exact、StartsWith ...のようになり、値Exactă(正確ではない)を設定しようとしていました。これは、DataTable.ReadXml(...)を使用して.xmlファイルからDataGridViewのDataTableを読み取っていたときに自動的に発生していました。 .xmlファイルの値はオフです。

関連する問題