C#保存动态填充的datagridview

Save datagridview dynamically filled in C#

我正在寻找解决我的问题的方法,与之前的问题有关。

我必须在 Datagridview 中管理不同的付款方式。

用户(例如收银员)必须在服务结束时检查他们所有的钱。

在父表单中,我显示付款方式名称、来自其他数据库的自动金额、两个空列和一个带按钮的列 "details"。

最初,父表单中的 datagridview 如下所示:

PAYMENT      |   QTY   |  AUTOMATIC  |  MANUAL  |  DIFF.   |  DETAILS  |
_____________|_________|_____________|__________|__________|___________|
CREDIT CARD  |   2     |    46.80    |          |          | [DETAILS] |
CHECK        |   1     |    25.65    |          |          | [DETAILS] |
BANK TRANSFER|   1     |   150.25    |          |          | [DETAILS] |

当用户单击详细信息按钮时,我会显示一个子表单和另一个包含付款方式详细信息的数据网格视图。我在父表单中加载这样的表单:

var details = new FrmDetails("FormName", "IdOfPaymentMethod");
details.ShowDialog();

例如,对于信用卡,我在子表单中得到一个数据网格视图,如下所示:

  DATE/HOUR          | TICKET NUMBER |  AMOUNT  |  CHECK  |
_____________________|_______________|__________|_________|
 01/11/2015 - 08:23  |   138170      |  12.90   |         |
 01/11/2015 - 09:45  |   138191      |  33.90   |    v    |

这是用户预先选择的日期的两次信用卡付款。两者的总和就是您在父表单的 "AUTOMATIC" 列中看到的内容。最后一列 "CHECK" 包含复选框,用户检查他们是否有付款。

在我的示例中,用户只检查带有 33.90 的第二行,而不检查另一行。 当他们关闭此详细信息表单时,父数据网格视图会像这样更新:

    PAYMENT      |   QTY   |  AUTOMATIC  |  MANUAL  |  DIFF.   |  DETAILS  |
    _____________|_________|_____________|__________|__________|___________|
    CREDIT CARD  |   2     |    46.80    |  33.90   | -12.90   | [DETAILS] |
    CHECK        |   1     |    25.65    |          |          | [DETAILS] |
    BANK TRANSFER|   1     |   150.25    |          |          | [DETAILS] |

这是应用程序的简单操作。 问题是我必须将每个 datagridview "details" 保存在 SQL 数据库(SQL 服务器)中。用户必须在这些付款之前输入其他信息,所以我认为的解决方案是将以前的数据保存在 table "ENTRIES" 中,然后检索 ID max,并保存每个 datagridview "details" a link ID_ENTRY 作为外键。 我可以使用单个 datagridview "details" 来做到这一点,但是当我按下父表单上的其他详细信息按钮时,我丢失了所有 check/uncheck 。

有没有办法将每个 datagridview "details" 保留到最后一次录制?

希望我的信息清晰全面。

FrmDetails 的每个实例的范围只是按钮单击事件的范围 - 因此数据消失了。

  • 要么您必须为每个付款方式行保留一组 FrmDetails 个实例:

    var details = new List<FrmDetails>();
    
    foreach (var row in dataGridView1.Rows)
    {
        var detail = new FrmDetails("FormName", "IdOfPaymentMethod");
        details.Add(detail);
    }
    
    // And when clicking on a Details button:
    details[e.ColumnIndex].ShowDialog();
    
  • 或它们等效数据的集合(我在这里使用了 List,但我推荐一些可绑定的东西 - 等待您的源代码):

    var detailsData = new List<DetailsDataSources>();
    
    foreach (var row in dataGridView1.Rows)
    {
        var details = GetThisRowsDetails();
        detailsData.Add(details);
    }
    
    // And when clicking on a Details button, somehow set the DataSource:
    var details = new FrmDetails("FormName");
    details.childDataGridView1.DataSource = detailsData[e.ColumnIndex];
    details.ShowDialog();
    /*
     * Ensure the changes made in the details form are then afterwards
     * reflected in detailsData[e.ColumnIndex]
     */