首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在DataGridViewTextBoxCell和DataGridViewComboBoxCell之间切换?

如何在DataGridViewTextBoxCell和DataGridViewComboBoxCell之间切换?
EN

Stack Overflow用户
提问于 2009-11-18 22:52:48
回答 3查看 13.1K关注 0票数 5

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

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

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

提前感谢!

更新:我认为,的一种方法是将第二列设置为DataGridViewComboBoxColumn,并更改单元格的属性,这样它的行为要么像下拉列表,要么作为(可编辑的)下拉列表而不带任何元素。后者看起来就像一个文本框,我可以使用它,而且它不需要改变单元格的类型。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-22 02:39:11

我没有VB.Net版本,但希望这个快速的C#片段能帮助您或指出正确的方向。

在本例中,我设置了一个带有2列的简单DataGridView。第一个是由两个选项填充的DataGridViewComboBox:"Text“或"Combo”。

第二列最初由设计器设置为DataGridViewTextBoxColumn。

我在CurrentCellDirtyStateChanged上处理DataGridView事件。我检查单元格是否脏,只检查第一列( ComboBox)。您必须调用CommitEdit以获得组合体中的新值,否则您将查看前面的值。基于组合框中的选择,然后用该类型的新单元格覆盖第二列中的单元格。

您将添加自己的逻辑(填充下拉列表并处理值)。您可能需要存储该值,然后将其放回单元格或其他任何地方。

下面是我使用的代码,并对其进行了快速而肮脏的测试:

代码语言:javascript
复制
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翻译,我进行了测试和工作。

代码语言:javascript
复制
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

端级

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

琼恩

票数 3
EN

Stack Overflow用户

发布于 2009-11-23 18:48:58

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

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

票数 2
EN

Stack Overflow用户

发布于 2014-09-22 09:03:02

代码语言:javascript
复制
dgvCell = new DataGridViewTextBoxCell();         // code to remove checkbox
        dgvCell.Value = string.Empty;
        dgv_modi_del_trans.Rows[1].Cells[0] = dgvCell;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1759720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档