web-dev-qa-db-ja.com

DataGridViewComboBoxCellバインディング-「値が無効です」

DataGridView内の個別のComboBoxセルをカスタムクラスにバインドしようとしていますが、エラーが発生し続けます

DataGridViewComboBoxCell値が無効です

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

実際の値を選択する方法を見つけようとしています。このエラーを削除するか、問題を解決する別の方法を見つけるために指定されたリスト内の0番目の項目。誰か提案がありますか?

26
Ian

質問を投稿してからまもなく解決策を見つけることができました。それ以外の場合:

問題は、Cellがデータソースにバインドされているため、ソース内のオブジェクトを自動的に見つけて更新することを期待して、_DataGridViewComboBoxCell.Value_をオブジェクトに割り当てようとしていたことです。

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

31
Ian

列挙型を使用するときの私の簡単な解決策は次のとおりです

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

「InitializeComponent();」の直後にそれを行うことができます

15
Sauleil

試行錯誤の末、ようやく機能する解決策を見つけました。

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

それだけです。

3
NaSo

同じ問題がありました。

私の場合、解決策は、外部キーテーブルのデータアダプタを埋めることでした。これは自動的に入力されず、これが問題の原因でした。

の中に Page_Loadイベント:

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

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

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

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

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

1
SubqueryCrunch

dataErrorイベントハンドラーを使用します。

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

displayMemberとValueMemberのデータ型は同じである必要があります。私の場合は、両方にCountryNameがあります。すべてがうまくいく... !!

1
Md Shahriar

私は同じ問題を抱えています。 (未作成の)DataGridにComboBox列を入力した後、DataGridViewComboBoxColumnのValueMemberプロパティを設定することで問題を解決しました。どうやら、ComboBox内のオブジェクトの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     
1

セルにヌル値を設定します。

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

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

0
GoTo