5

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

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

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

前もって感謝します!

更新: 回避策の 1 つは、2 番目の列を DataGridViewComboBoxColumn として作成し、セルの属性を変更して、ドロップダウン リストのように動作するか、または (編集可能な) ドロップダウンとして動作するようにすることです。要素。後者は、私がそれと一緒に暮らすことができるテキストボックスのように見え、セルのタイプを変更する必要はありません.

4

3 に答える 3

3

私は VB.Net バージョンを持っていませんが、うまくいけば、この簡単な C# スニペットがあなたを助けたり、正しい方向に向けたりするでしょう。

この例では、2 つの列を持つ単純な DataGridView を設定します。1 つ目は、"Text" または "Combo" の 2 つの選択肢が設定された DataGridViewComboBox です。

2 番目の列は、最初はデザイナーから DataGridViewTextBoxColumn に設定されています。

DataGridView で CurrentCellDirtyStateChanged イベントを処理します。セルが汚れているかどうかを確認し、最初の列 (ComboBox) のみを確認します。コンボで新しい値を取得するには、CommitEdit を呼び出す必要があります。そうしないと、前の値が表示されます。コンボ ボックスでの選択に基づいて、2 列目のセルをそのタイプの新しいセルで上書きします。

独自のロジックを追加します (ドロップダウンに入力して値を処理します)。値を保存してから、セルなどに戻したい場合があります。

これが私が使用し、簡単で汚いテストを行ったコードです。

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

クラス終了

その列に保存されている値は失われるため、最初に保存する必要があります。

ジョン

于 2009-11-22T02:39:11.857 に答える
2

ユーザー コントロールをホストする独自のセル テンプレートを作成できます。ユーザー コントロールでは、テキスト ボックスとコンボ ボックスを追加し、メソッド/プロパティを追加して、一方を表示し、他方を非表示にします。

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

于 2009-11-23T18:48:58.800 に答える
0
dgvCell = new DataGridViewTextBoxCell();         // code to remove checkbox
        dgvCell.Value = string.Empty;
        dgv_modi_del_trans.Rows[1].Cells[0] = dgvCell;
于 2014-09-22T09:03:02.997 に答える