如何在DataGridViewTextBoxCell和DataGridViewComboBoxCell之间切换?

2024-03-10

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

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

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

提前致谢!

Update:我想,解决这个问题的一种方法是将第二列设置为 DataGridViewComboBoxColumn,并更改单元格的属性,以便它的行为类似于下拉列表,或者充当没有元素的(可编辑)下拉列表。后者看起来很像一个文本框,我可以接受它,并且它不会涉及更改单元格的类型。


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

在此示例中,我设置了一个包含 2 列的简单 DataGridView。第一个是 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

结束课程

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

Jon

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在DataGridViewTextBoxCell和DataGridViewComboBoxCell之间切换? 的相关文章

随机推荐

  • 如何根据用户区域设置设置数字和日期的格式?

    我需要一种根据用户的区域设置自动格式化日期和数字对象的方法 到目前为止 我一直在使用toLocaleString 日期函数 对于数字来说 toLocaleString 也是可用的 但是正如您在jsFiddle http jsfiddle n
  • SqlAlchemy:如果对象尚不存在,则创建对象?

    我是 SQLAlchemy 的新手 我目前有 ev model EnumerationValue key key level 2 code level 2 ev keyvalues key parent level 1 model Sess
  • 简单的Java计算器(需要小数帮助)[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 好的 这是我的简单 java 计算器 一切正常 我只需要允许小数的帮助 非常感谢帮助我的人 这是一个学校项目 所以我需要很快得到答案 imp
  • 安装旧版本的 Mono

    今天我的 Ubuntu 将 Mono 更新到了 4 2 1 102 它不会允许我绝对需要运行的某个程序 如何将其降级到 4 0 5 1 我努力了 sudo apt get install mono complete 4 0 5 1 那是行不
  • alt 属性可以用于输入类型按钮吗

    我想询问输入标签中的 alt 属性 正如我在许多网站上发现的那样 当我们输入图像类型时 会使用 alt 属性 1 可以用于输入型按钮吗
  • 如何使用最新版本的 R RDCOMClient 从 Outlook 发送邮件?

    当我使用最新版本的 R RDCOMClient 包发送 Outlook 电子邮件时 它显示错误 相同的代码 library RDCOMClient init com api OutApp lt COMCreate Outlook Appli
  • 通过spring AOP + Aspectj进行异常处理

    在我的项目中 我有一个域层 它基本上是 POJO 和一个位于域层之上的 Spring 控制器 服务层 我还有一个位于服务和域之间的 AOP 层 我的域层正在抛出业务异常 这些异常现在正在服务层中处理 但是我想更改它 以便从领域层抛出的异常将
  • Backbone.js 视图的合适粒度是多少?

    我正在采用 Backbone js 来渲染一个小角落现有的大型网络应用程序 http www esvonline org 如果进展顺利 我可以看到 Backbone js 不断发展以涵盖整个应用程序 为有机增长的应用程序提供一些急需的结构
  • 了解Scheme函数

    我们的编程语言练习考试中给出了以下问题 我很难理解它是如何工作的 有人能告诉我代码流程是什么吗 我已经在球拍中运行过它并且知道答案是什么 看起来第一个 lambda 函数将其他两个函数作为参数 但输入在哪里 lambda x 2 and l
  • 在 C 中创建字符串的宏

    替代标题 以帮助搜索 将预处理器标记转换为字符串 我怎样才能从一个字符串C宏的价值 原始问题 我想用C define在编译时构建文字字符串 该字符串是因调试 发布等而更改的域 我想做这样的事情 ifdef TESTING define IV
  • 是否有 Perl 模块可以连接 Google Contacts API?

    我想编写一个命令行程序来将联系人添加到 GoogleMail WWW 联系方式 Google联系方式 http search cpan org dist WWW Contact GoogleContactsAPI似乎只能从 Google 获
  • 多核机器上 .NET 操作的非线性扩展

    我在 NET 应用程序中遇到了一种奇怪的行为 该应用程序对一组内存数据执行一些高度并行的处理 当在多核处理器 IntelCore2 Quad Q6600 2 4GHz 上运行时 它会在启动多个线程来处理数据时表现出非线性扩展 当在单核上作为
  • Wix升级:预选功能

    我们使用 Wix 来创建我们的安装程序 我们使用的用户界面可以选择需要安装的功能 某些功能默认启用 其他功能则禁用 但是 当我们运行升级时 这些默认值将被保留 我们希望安装程序记住安装了哪些功能 并在功能树中启用它们以进行升级 应禁用所有其
  • Railsinstaller 遇到问题

    我在 Windows 8 笔记本电脑上遇到了 Railsinstaller 问题 这是由于无法使用以下命令在 项目 目录中运行服务器rails s命令 但是与许多教程相反 我每次都会收到这个命令 C Sites demo gt rails
  • 商业产品中的 JavaFX [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用 JavaFX 作为大型商业产品的开发框架 我可以在不违反 Oracle 许可的情况下关闭未来产品的源代码并使用 Oracle JavaFX
  • 我想显示第一个列表中的第一个单词并显示第二个列表中的 10 个单词,依此类推-python。我尝试使用 range 和 zip。它仍然不起作用

    在这里 我正在创建一个名为 li 的列表 其中包含标签文本和名为 list2 的列表 其中包含 span 文本 我使用 zip 附加它 现在 我有一个名为 name 的第三个列表 它有 2 个值 最活跃者 增益者 我想要 Mostactiv
  • 在 dataclasses.field 中使用显式 __init__ 构造函数和 default_factory 参数时,数据类属性丢失

    以下代码创建一个数据类Obj带有 int 字段n默认值为 0 from dataclasses import dataclass field dataclass class Obj n int field default factory i
  • scala:匹配对象的类型参数

    例如 如果我有一个接受 Type 参数的类Seq T 我有很多此类的对象 我想根据类型参数拆分它们T 例如 val x List Seq Int 1 2 3 4 5 6 7 8 9 0 Seq String a b c x foreach
  • 错误:管道的另一端没有进程

    我正在使用 SQL Server 2012 仅限本地主机 和 SQL Server Management Studio SSMS 来查看包含二进制值 图片 的表图片 大小为 928 行 大小并不大 只有那张桌子有问题 即使在重新启动 SQL
  • 如何在DataGridViewTextBoxCell和DataGridViewComboBoxCell之间切换?

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