将值从 datagridview 转换为文本框

Posted

技术标签:

【中文标题】将值从 datagridview 转换为文本框【英文标题】:Converting value from datagridview to a text box 【发布时间】:2021-12-12 18:43:13 【问题描述】:

我的代码如下,我无法从数据表中获取值以显示在主窗体的文本框中。我最近意识到 DataGridView 与 DataTable 不同。我认为这让我更接近了。我最初在获取特定索引时遇到问题,因为数据表不能那样工作。现在我正在使用 datagridview,我觉得我几乎在那里,但缺少一些愚蠢的东西。

我的代码

    private void dt_SelectionChanged(object sender, EventArgs e)
        
            DataGridView dgv = new DataGridView();
            dgv.DataSource = dt;

            if (dgv.SelectedCells.Count > 0)
            
                active_Description.Text = 
                Convert.ToString(dgv.CurrentRow.Cells["Description"].Value);
                active_Cost.Text = Convert.ToString(dgv.CurrentRow.Cells["Cost"].Value);
                active_Diameter.Text = Convert.ToString(dgv.CurrentRow.Cells["Diameter"].Value);
                active_Last_Used.Text = Convert.ToString(dgv.CurrentRow.Cells["CareTaker"].Value);
                active_Location.Text = Convert.ToString(dgv.CurrentRow.Cells["Location"].Value);
                active_OAL.Text = Convert.ToString(dgv.CurrentRow.Cells["OAL"].Value);
                active_Vendor.Text = Convert.ToString(dgv.CurrentRow.Cells["Vendor"].Value);
            

        

【问题讨论】:

有错误?还是空值?还是什么? 【参考方案1】:

是的; DataGridView 是一种以表格方式显示数据的 UI 设备,类似于 Excel 的显示方式。 DataTable 是一种以表格方式存储数据的设备。如果您有数据要存储,则将其放入数据表中,如果您想显示它,您可以告诉 datagridview 将表用作数据源,但它们是非常不同的东西

DataGridView 一次显示多行数据,而文本框只能显示一个值。通常,当我们混合使用这两者时,我们最终会使用 DGV 作为导航设备(它显示例如 20 行,我们可以单击其中一个使其成为“当前行”)并且任何也使用相同数据源的文本框通常会显示当前行数据

您尝试手动组合的代码可以使用数据绑定更简单地完成,其中 DataGridView 和 TextBoxes 都绑定到同一个 BindingSource; BS 负责维护“当前行”的概念

为了让您的生活更轻松,请按照以下步骤操作:

将新文件添加到您的项目中,类型为 DataSet 打开数据集,右键单击表面并添加一个数据表,将其命名为 Product(您看起来像是在制作某种与产品相关的系统) 右键单击表格并添加一个新列,将其命名为描述 为成本添加另一列(输入小数?)直径(整数?小数?)等 切换到您的表单设计器 打开数据源窗口(查看菜单、其他窗口) - 如果您使用的是 .net 核心,它目前无法正常工作,所以希望您使用的是框架。还有其他方法可以在核心上执行此过程,只是比较麻烦 展开数据源中的所有节点 您可以看到父节点 Product 带有一个小网格图标。它有孩子的图标看起来更像文本框等 将产品节点拖到表单上;出现一个 DataGridView,以及一个数据集、绑定源和导航器(在底部托盘中) 也将一些子节点拖到表单中,文本框会出现,但您会注意到它们重用了现有的产品绑定源 如果您检查 DGV 和文本框,您会发现它们具有设置为绑定源的数据源,并且绑定源具有数据集的数据源(以及 products 表的数据成员)

这就是你真正需要做的;您可以将一些代码放入您的构造函数中,用数据填充您的数据集,或者您可以在运行时执行此操作。现在在运行时执行;运行应用程序,输入 3 行左右的数据,然后在它们之间上下点击;您会注意到文本框会根据 DGV 中的活动行而变化

如果您想查看 Visual Studio 编写的用于连接所有这些的代码,请查看 Designer.cs 文件

如果您从数据库中获取这些数据,请查看我对 Michal here 的回答 - 实际上它与上面发布的内容相关; Michal 引用了数据库中的数据,因此很多答案都是针对将数据拉出并放入数据集,在 DGV 和文本框中显示然后将其发送回来,但屏幕截图和其他有关显示和操作的相关部分数据(即在数据集中)也会帮助你

【讨论】:

会试一试,看看 Michal 的答案。我正在从 Excel 文档中提取。感谢您对所有这些的解释! 从excel拉取数据有多种方式;对于您正在做的事情,最直接的可能是使用 jet/ace db 驱动程序(Microsoft Access)打开 xlsx;一个数据适配器(我假设是一个表适配器;我从未尝试过)可以建立一个到 excel 文件的连接,就好像它是一个数据库一样,并用它填充一个数据表。其他方法也可能会奏效;像 CsvHelper 这样可以将 csv 文件转换为一组对象的库,可以用来生成强类型数据行;我上面提到的 Products 表中的行具有您可以期望的命名属性 查看我的 excel 表实际上只是引用了一个 .json 文件。所以使用excel有点多余。我现在正在研究反序列化。上面回答对我来说没问题。 最简单的方法;把你的 json 粘贴到 QuickType.io 中——它会为你生成一堆类。然后,您可以双击数据集中的一个表以进入后面的代码并为数据行创建一个部分类,从 QT 创建的类中提取属性并将它们粘贴到数据行的部分类中,然后连接 json 属性,以便它们设置列属性。我本来主张只配置东西,以便 json deser 直接设置列道具,但我认为它们是自动生成的,没有简单的方法向它们添加属性.. 你可以让json反序列化器将json记录直接放入数据行

以上是关于将值从 datagridview 转换为文本框的主要内容,如果未能解决你的问题,请参考以下文章

将值从一个 DataGridView 复制到另一个

将值从文本框传递到 SQL 查询中的“TOP n”子句

从简单模式窗口将值从 asp.net 复选框或文本框传递到服务器时遇到问题

如何将值从一个活动传递到上一个活动

将值从表单传递到表单

将值从 JsonObject 转换为 BigDecimal