在 datagridview 和表单之间传递数据的更有效方式

Posted

技术标签:

【中文标题】在 datagridview 和表单之间传递数据的更有效方式【英文标题】:More efficient way of passing data between datagridview and form 【发布时间】:2012-05-17 12:23:21 【问题描述】:

我有一个程序,其中包含许多“创建新 [xxx]”表单(包含文本框、组合框、日期时间 picekrs 等),这些表单稍后会保存到数据库中。为了查看该数据,我使用了相应的表单“view [xxx]”,其中包含从数据库填充的 datagridview。

当用户点击数据网格视图中的字段时,数据应该被发送回原来的“创建”表单。

到目前为止,我一直通过从 datagridview 传递整行数据来重载“创建”表单的构造函数:

示例:

查看表格:

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    
        if (e.RowIndex > -1)
        
            ID = dataGridView1.Rows[e.RowIndex].Cells[0].FormattedValue.ToString();
            string posName = dataGridView1.Rows[e.RowIndex].Cells[1].FormattedValue.ToString();
            string posDesc = dataGridView1.Rows[e.RowIndex].Cells[2].FormattedValue.ToString();

            frmNewStaffPosition frm = new frmNewStaffPosition(posName, posDesc);

            frm.Show();
frm.NewTypePositionAdded += new frmNewStaffPosition.AddNewTypeOfStaffPosition(frm_NewTypePositionAdded);

创建表格:

   public frmNewStaffPosition( string pos, string desc)
    
        InitializeComponent();
        tbPositionName.Text = pos;
        tbNewStaffPositionDecription.Text = desc;



    

虽然这可行,但我不认为它是最好的解决方案,尤其是当从 VIEW 传递的数据包含许多列时。有没有更优雅的解决方案,即只传递选定行的 PK 并直接从数据库填写 CREATE 表单?

如果没关系,我通过 mysql 连接器使用 MySQL 数据库。

【问题讨论】:

你找到最好的方法了吗? 【参考方案1】:

如果您的列少于几百列,只要您的列不是具有几 MB 数据的 BLOB,我猜这对您的程序来说不是性能障碍。如果您要传递数百(或数千)行,那将是一个完全不同的问题,但是即使您有 200 列左右的列在计算机上传递那么多数据也没什么,它可以做很多很多次一段你无法注意到的时间。

不要过早优化。您的程序是否运行缓慢以完成其工作?如果没有,请不要打扰,你已经完成了。如果是这样,请使用分析器查看什么花费的时间超过了应有的时间,并在那里寻找优化。

哦,如果您有超过一或两列,最好为每列创建一个包含字段的类,填充该类的一个实例,然后传递它。它比处理大量参数要容易得多。

【讨论】:

【参考方案2】:

取决于负责人。 传递它们的密钥是一种方法,但是您必须将数据库代码添加到表单中。事实证明,这将是混乱的耦合,并且看到您正在使用 FormattedValue,您必须重新实现它。

您可以敲出一个类来放入数据并将其传递进去,然后将所有来往和来自东西的东西委托给该类,或者更好的是它实现的接口。

或者您可以保持原样,因为所有这些都在移动/隐藏您现在拥有的凌乱部分。

如果事实证明您的几个表单都使用常见的数据分组,那么可能值得一看,如果不是,请不要认为我会打扰自己。

也就是说,从网格底层的数据源(即数据行)传递我会更舒服,否则对于任何非字符串值,除非表单仅处理数据,否则您将要转换/解析到或从中转换作为一个字符串。

【讨论】:

【参考方案3】:

通常我会遵循这些基本规则...

1) 如果您正在查找/编辑特定记录数据,则仅将关键数据传递给构造函数到下一个表单。

2) 如果您要使用默认值创建新数据,请将它们放入一个类中。

【讨论】:

嗯...“菜鸟”问题然后:如何用数据库中的数据很好地填写表格?我可以创建 SQL 语句 ("SELECT * FROM xxx WHERE ID= x" 并读取该行,但是我会有一个需要切割的长字符串,对吧? 如果你在winform中工作,你可以使用BindingSource类来创建你的结果数据集并委托给显示成员的所有UI。

以上是关于在 datagridview 和表单之间传递数据的更有效方式的主要内容,如果未能解决你的问题,请参考以下文章

双击datagridview中的行并获取特定单元格的值并将其传递给另一个表单

如何将值从一个表单传递到另一个表单的动态创建的控件

使用 C# 在表单之间传递数据的最佳方式

如何跨应用程序在多个 Datagridviews 之间共享 DataTable 并节省宝贵的内存

使用 JSON 在 python 和 javascript 之间传递数据

在表单之间传递值并从数据库中检索数据