我想有一个有两列一个DataGridView。第一列永远是类型DataGridViewComboBoxColumn的。基于该列中的选择,我想能够在第二列改变对应的单元到任何一个的DataGridViewComboBoxCell或DataGridViewTextBoxCell。

我想我只需要做出型的DataGridViewColumn的第二列,但不明白如何动态更改单元格类型的机制。

我用VB.NET工作在Visual Studio 2005。

提前感谢!

<强>更新一分围绕它的方式,我想,是使第二列作为DataGridViewComboBoxColumn,并改变细胞的特性,使得它要么表现得像下拉列表,或者作为(可编辑)没有元素下拉。后者看起来很喜欢,我可以忍受它的文本框,它不涉及改变细胞的类型。

有帮助吗?

解决方案

我没有VB.Net版本,但希望这种快速的C#代码段会帮助你或你指出正确的方向。

在这个例子中,我建立一个简单的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

末级

您将失去存储在该列的任何值,所以你需要先保存它。

乔恩

其他提示

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

此示例创建一个单选按钮细胞,这是不难改变代码到主机的用户控件。

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