Vb.net 如何在DataGridViewTextBoxCell和DataGridViewComboxCell之间切换?

Vb.net 如何在DataGridViewTextBoxCell和DataGridViewComboxCell之间切换?,vb.net,visual-studio-2005,datagridview,datagridviewcomboboxcell,datagridviewtextboxcell,Vb.net,Visual Studio 2005,Datagridview,Datagridviewcomboboxcell,Datagridviewtextboxcell,我想要一个有两列的DataGridView。第一列的类型始终为DataGridViewComboBoxColumn。根据该列中的选择,我希望能够将第二列中相应的单元格更改为DataGridViewComboxCell或DataGridViewTextBoxCell 我想我只需要创建DataGridViewColumn类型的第二列,但不了解如何动态更改单元格类型的机制 我正在Visual Studio 2005中使用VB.NET 提前谢谢 更新:我想,解决方法之一是将第二列设置为DataGridV

我想要一个有两列的DataGridView。第一列的类型始终为DataGridViewComboBoxColumn。根据该列中的选择,我希望能够将第二列中相应的单元格更改为DataGridViewComboxCell或DataGridViewTextBoxCell

我想我只需要创建DataGridViewColumn类型的第二列,但不了解如何动态更改单元格类型的机制

我正在Visual Studio 2005中使用VB.NET

提前谢谢


更新:我想,解决方法之一是将第二列设置为DataGridViewComboBoxColumn,并更改单元格的属性,使其行为类似于下拉列表,或者是不包含任何元素的(可编辑)下拉列表。后者看起来很像一个文本框,我可以使用它,而且它不需要改变单元格的类型。

我没有VB.Net版本,但希望这个快速的C代码片段能够帮助您或为您指明正确的方向

在本例中,我设置了一个包含2列的简单DataGridView。第一个是DataGridViewComboBox,其中填充了两个选项:“文本”或“组合”

第二列最初从设计器设置为DataGridViewTextBoxColumn

我处理DataGridView上的CurrentCellDirtyStateChanged事件。我检查单元格是否脏,只检查第一列(组合框)。您必须调用CommittedIt以获取组合中的新值,否则您将看到以前的值。根据组合框中的选择,我用该类型的新单元格覆盖第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
末级

您将丢失该列中存储的任何值,因此需要先保存它


Jon

您可以创建自己的单元格模板,以承载用户控件。在用户控件中添加一个文本框和一个组合框,并添加一个方法/属性来显示一个和隐藏另一个


创建单选按钮单元格,更改代码以承载用户控件并不困难。

谢谢。这很有帮助。我不是一个真正的VB或.NET专家,所以我知道你在做什么,但在VB中分配一个新DataGridViewTextBoxCell或一个新DataGridViewComboxCell的机制仍然需要弄清楚。无论如何,我感谢你花了这么多时间来回答,今天下午我会试试的。
dgvCell = new DataGridViewTextBoxCell();         // code to remove checkbox
        dgvCell.Value = string.Empty;
        dgv_modi_del_trans.Rows[1].Cells[0] = dgvCell;