質問

2 つの列を持つ DataGridView が必要です。最初の列は常に DataGridViewComboBoxColumn 型になります。その列の選択に基づいて、2 番目の列の対応するセルを DataGridViewComboBoxCell または DataGridViewTextBoxCell に変更できるようにしたいと考えています。

DataGridViewColumn 型の 2 番目の列を作成する必要があるだけだと考えていますが、セルの型をその場で変更する方法の仕組みがわかりません。

Visual Studio 2005 で VB.NET を使用しています。

前もって感謝します!

アップデート: これを回避する方法の 1 つは、2 番目の列を DataGridViewComboBoxColumn として作成し、セルの属性を変更して、ドロップダウン リストのように動作するか、要素のない (編集可能な) ドロップダウンとして動作するようにすることだと思います。後者はテキスト ボックスによく似ているので、そのまま使用できます。セルの種類を変更する必要はありません。

役に立ちましたか?

解決

私はVB.Netのバージョンを持っていないが、うまくいけば、このクイックC#のスニペットはあなたを助けるか、正しい方向にあなたを指します。

この例では、Iは、2列の簡単のDataGridViewを設定します。 。「テキスト」または「コンボ」

:最初の2つの選択肢が移入されDataGridViewComboBox

第二カラムは、最初に、設計者からDataGridViewTextBoxColumnに設定されている。

私はDataGridViewの上CurrentCellDirtyStateChangedイベントを処理します。セルが汚れていると、最初の列(コンボボックス)をチェックすると、私は確認してください。あなたはコンボに新しい値を取得するためにcommitEditを呼び出すか、他あなたが前の値を見ていますなきゃ。コンボボックスの選択に基づいて、私は、そのタイプの新しいセルと第二列のセルを上書きします。

あなたは独自のロジックを追加します(ドロップダウンを移入し、値を扱う)です。あなたは、値を格納し、その後、細胞または何にそれを戻すしたい場合があります。

ここで私は上で迅速かつ汚いテストを使用していたコードがあります

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
        if (dataGridView1.IsCurrentCellDirty == false)
        {
            return;
        }

        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);

        if (dataGridView1.CurrentCell.ColumnIndex == 0)
        {               
            if (((string)dataGridView1.CurrentCell.Value) == "Text")
            {
                dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1] = new DataGridViewTextBoxCell();
            }
            else if (((string)dataGridView1.CurrentCell.Value) == "Combo")
            {
                dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1] = new DataGridViewComboBoxCell();
            }
        }
    }

ここでは簡単VBの翻訳は、私がテストされ、動作すること、である。

Public Class Form1

Private Sub DataGridView1_CurrentCellDirtyStateChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged

    If DataGridView1.IsCurrentCellDirty = False Then
        Return
    End If

    DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)

    If DataGridView1.CurrentCell.ColumnIndex = 0 Then

        If CStr(DataGridView1.CurrentCell.Value) = "Text" Then
            DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(1) = New DataGridViewTextBoxCell

        ElseIf CStr(DataGridView1.CurrentCell.Value) = "Combo" Then
            DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(1) = New DataGridViewComboBoxCell
        End If

    End If


End Sub

エンドクラス

あなたはその列に格納されている任意の値を失うことになるので、あなたが最初にそれを保存する必要があります。

ジョン

他のヒント

あなたはユーザーコントロールをホストする独自のセルテンプレートを作成することができます。ユーザーコントロールでは、テキストボックスやコンボボックスを追加し、1を表示し、別のものを非表示にする方法/プロパティを追加します。

このサンプルには、ラジオボタンを作成し、セルは、それがユーザーコントロールをホストするためにコードを変更することは困難ではありません。

dgvCell = new DataGridViewTextBoxCell();         // code to remove checkbox
        dgvCell.Value = string.Empty;
        dgv_modi_del_trans.Rows[1].Cells[0] = dgvCell;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top