0

2つの列を持つバインドされていないDataGridViewがあります。最初の列は単なる文字列値です。2番目の列ユーザーがセルをクリックしたときにのみコンボボックスを表示したい(DataGridViewColumnとして列全体ではない)。以下のコードを使用しましたが、これは正しくなく、エラーが発生します。SetCurrentCellAddressCore関数への再入可能な呼び出しが発生するため、操作は無効です。 最初の列は入力され、2番目の列は空です。

コードは以下の通りです:

Private Sub DGVFieldsMap_CellEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGVFieldsMap.CellEnter
    If e.ColumnIndex = 1 Then
        If cboClmCell Is Nothing Then
            Dim dgv As DataGridView = CType(sender, DataGridView)
            cboClmCell = New DataGridViewComboBoxCell
            cboClmCell.Items.Add("A")
            cboClmCell.Items.Add("B")
            cboClmCell.Items.Add("C")
            cboClmCell.Items.Add("D")
            cboClmCell.Items.Add("E")
            cboClmCell.Items.Add("F")
            dgv.Focus()
            dgv(e.ColumnIndex, e.RowIndex) = cboClmCell '[Error Here]
            isCombo = True
        End If
    End If
End Sub


Private Sub DGVFieldsMap_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles DGVFieldsMap.CellValidating
        If e.ColumnIndex = 1 Then
            Dim dgv As DataGridView = CType(sender, DataGridView)
            If isCombo Then
                isCombo = False
                cboClmCell = Nothing
                dgv(e.ColumnIndex, e.RowIndex) = New DataGridViewTextBoxCell()
            End If
        End If
End Sub

誰かが私に2つの列を持つ完全な実例を教えてもらえますか?2番目の列はComboBoxCellですが、ユーザーがクリックしたときだけです。また、DataGridViewセルで選択した値を取得する必要があります。前もって感謝します。

4

2 に答える 2

0

イベントハンドラーの列を置き換えようとしないでください。代わりに、2列のDataGridViewを作成し、2番目の列をDataGridViewComboBoxColumnにします。その列には「DisplayStyle」というプロパティがあり、編集していないときの列の外観を決定します。「なし」に設定します。これで、編集モードに入るまではテキストボックスのように見え、その時点でコンボボックスのように見えます。

于 2012-08-13T17:45:09.883 に答える
0

同様のDataGridViewがあり、最初の列はテキストラベルで、2番目の列はComboBoxです。

注:以下のコードはC#ですが、概念はvb.netと同じです。

フォームのloadイベントで、データソースを設定して列を作成する関数を呼び出します

private void frmCfgEdit_Load(object sender, EventArgs e)
{
    // Fill CFG Data Grid
    FillCfgDataGrid();
}

 private void FillCfgDataGrid()
 {

    // Do not automatically generate the columns based on the datasource public fields
    dgCFG.AutoGenerateColumns = false;

    // Define data source
    dgCFG.DataSource = _pDriveElement.CfgTableViewRecs;

    // Define data grid columns 
    SetUpCFGDataGrid(dgCFG);
 }

 public void SetUpCFGDataGrid(DataGridView dgCFG, String TableIdentifier)
 {
    // Create datagridview text column
    AddGridColumn(dgCFG,  "Label", "CfgLabel", 350, typeof(System.String), true, false);
    // Create datadridview combobox column
    AddGridComboColumn(dgCFG,  "Value",  350, typeof(System.String), false, true);

 }

 public void AddGridColumn(DataGridView dg, String sHeaderText, String sDataPropertyName, int iWidth, Type tyValueType, bool bReadOnly, bool bLastCol)
 {
     DataGridViewTextBoxColumn colTxt = new DataGridViewTextBoxColumn();
     colTxt.HeaderText = sHeaderText;
     colTxt.Width = iWidth;
     colTxt.ReadOnly = bReadOnly;

     // Add the text box to the data grid
     dg.Columns.Add(colTxt);
     int iColumn = dg.Columns.Count - 1;

     // Define bindings to text columns
     dg.Columns[iColumn].DataPropertyName = sDataPropertyName;
     dg.Columns[iColumn].ValueType = tyValueType;
     if (tyValueType == typeof(System.Single))    dg.Columns[iColumn].DefaultCellStyle.Format = "F6";
        if (bLastCol) dg.Columns[iColumn].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        if (iColumn > 0) dg.Columns[iColumn].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
 }

 public void AddGridComboColumn(DataGridView dg, String sHeaderText,  int iWidth, Type tyValueType, bool bReadOnly, bool bLastCol)
 {
     DataGridViewComboBoxColumn cb = new DataGridViewComboBoxColumn();
     cb.FlatStyle = FlatStyle.Flat;
     cb.HeaderText = sHeaderText;
     cb.Width = iWidth;
     cb.ReadOnly = bReadOnly;
     dg.Columns.Add(cb);
     int iColumn = dg.Columns.Count - 1;

     // Combo box is always left aligned
     dg.Columns[iColumn].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;

     if (bLastCol) dg.Columns[iColumn].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

 }
于 2012-10-12T12:57:42.790 に答える