在数据网格视图和表单之间传递数据的更有效方法

本文关键字:数据 有效 方法 表单 网格 数据网 视图 之间 | 更新日期: 2023-09-27 18:33:45

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

当用户单击datagridview中的字段时,数据应该被发送回原始的"创建"表单。

到目前为止,我一直通过在从 datagridview 传递整行的数据来重载"create"表单的构造函数来做到这一点:

例:

查看表格:

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数据库。

在数据网格视图和表单之间传递数据的更有效方法

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

不要过早优化。 您的程序是否运行缓慢,无法完成其工作? 如果没有,根本不打扰,你就完成了。 如果是,请使用探查器查看花费的时间比应有的时间长,并在那里查找优化。

哦,如果你有超过一两列,最好创建一个类,每列都有字段,填充该类的一个实例,然后传递它。 它比很多很多参数更容易处理。

取决于负责

什么。传递它们键是一种方式,但随后您必须将数据库代码添加到表单中。事实证明,这是混乱的耦合明智,并且看到您正在使用FormattedValue,您必须重新实现它。

你可以敲出一个类来放入数据并将其传入,并将所有的东西委托给类,或者更好的是它实现的接口。

或者你可以保持原样,因为所有这些正在做的是移动/隐藏你现在拥有的混乱部分。

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

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

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

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

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