C# 在datagridview和窗体之间传递数据的更高效的方法

C# 在datagridview和窗体之间传递数据的更高效的方法,c#,mysql,visual-studio-2010,datagridview,C#,Mysql,Visual Studio 2010,Datagridview,我有一个包含许多“创建新[xxx]”表单(包含文本框、组合框、日期时间picekrs等)的程序,这些表单后来保存到数据库中。为了查看这些数据,我使用了相应的表单“view[xxx]”,该表单由数据库填充了datagridview 当用户单击datagridview中的字段时,应该将数据发送回原始的“创建”表单 到目前为止,我一直通过从datagridview传递整行数据来重载“create”表单的构造函数: 例如: 查看表格: private void dataGridView1_CellCon

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

当用户单击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;



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


如果这有关系,我会通过MySQL连接器使用MySQL数据库。

如果您的列不到几百列,只要您的列不是包含数MB数据的BLOB,我猜这不会对您的程序造成性能障碍。如果您要传递几百(或几千)行,那么这将是一个完全不同的问题,但即使您有200个左右的列,为一台计算机传递那么多数据也算不了什么,它可以在您无法注意到的时间间隔内做很多次

不要过早地优化。你的程序运行速度慢吗?如果没有,不用麻烦了,你就完了。如果是的话,请使用探查器查看所花费的时间比它应该花费的时间长,并在那里寻找优化


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

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

您可以创建一个类来放入数据并将其传递,然后将所有往返的内容委托给该类,或者更好的是委托给它实现的接口

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

如果发现您的几个表单使用的是公共数据分组,那么可能值得一看,如果不是,请不要认为我会打扰自己


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

通常我会使用这些底层规则

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


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

Hmm。。。“Noob”问题:如何用数据库中的数据很好地填充表单?我可以创建SQL语句(“SELECT*FROM xxx,其中ID=x”)并读取该行,但是我会有一个需要剪切的长字符串,对吗?如果您在winform中工作,您可以使用BindingSource类创建结果数据集并委托给显示成员的所有UI。您找到了最佳方法吗?