2009-08-31 23 views
1

DataGridViewを列DataGridViewComboBoxColumnで作成しています。最初はコンボボックスのItemはItems.Add( "sometext")を使用して値で埋められます。ランタイム中にDataGridViewのDataGridViewComboBoxColumnに項目を追加する

DataGridViewのイベントEditingControlShowingで返されるDataGridViewComboBoxEditingControlに、さらに値が追加されます。

これ以降、最初に追加した値を正しく選択できますが、後で「DataGridViewComboBoxCellの値が無効です」というメッセージが表示される例外を選択しようとすると、スローされます。

なぜでしょうか?

答えて

3

ComboBoxValidatingイベントを処理してそこに追加する必要があります。ここにいくつかのコードがあります:

private void HandleEditShowing(
     object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     var cbo = e.Control as ComboBox; 
     if (cbo == null) 
     { 
      return; 
     } 

     cbo.DropDownStyle = ComboBoxStyle.DropDown; 
     cbo.Validating -= HandleComboBoxValidating; 
     cbo.Validating += HandleComboBoxValidating; 
    } 

    private void HandleComboBoxValidating(object sender, CancelEventArgs e) 
    { 
     var combo = sender as DataGridViewComboBoxEditingControl; 
     if (combo == null) 
     { 
      return; 
     } 
     //check if item is already in drop down, if not, add it to all 
     if (!combo.Items.Contains(combo.Text)) 
     { 
      var comboColumn = this.dataGridView1.Columns[ 
       this.dataGridView1.CurrentCell.ColumnIndex] as 
        DataGridViewComboBoxColumn; 
      combo.Items.Add(combo.Text); 
      comboColumn.Items.Add(combo.Text); 
      this.dataGridView1.CurrentCell.Value = combo.Text; 
     } 
    } 

したがって、あなたがEditingControlShowingイベントを処理するとき、コンボボックスのValidatingイベントにフックします。ユーザーが何らかのテキストをDataGridViewコンボボックスに入力してからタブを押すと、そのイベントが発生します。その時点で、実際のDataGridViewColumnに加えて、コンボボックス自体にそれを追加して、DataGridView内の他のすべての行がその値を持つようにする必要があります。

0

これを試してみて、

DataGridViewComboBoxColumn Column_ModemList = (DataGridViewComboBoxColumn)this.DGV_Groups.Columns["DGV_Groups_ModemList"]; 
Column_ModemList.Items.Add(l_modem_str); 

注:falseAllowUserToAddRowsプロパティを設定します。

関連する問題