保存动态填充C#

时间:2015-11-03 09:14:55

标签: c# sql-server dynamic datagridview

我正在寻找一种方法来解决我的问题,与前一个问题相关。

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

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

在父表单中,我显示付款方式名称,自动从其他数据库中获取金额,两个空列和一个带有“详细信息”按钮的列。

最初,父表单中的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();

例如,对于信用卡,我在子窗体中获得了一个datagridview,如下所示:

  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] |

这是应用程序的简单操作。 问题是我必须在SQL数据库(SQL Server)中保存每个datagridview“details”。用户必须在这些付款之前输入其他信息,因此我认为解决方案是将先前的数据保存在表“ENTRIES”中然后检索ID max,并使用链接ID_ENTRY作为外键保存每个datagridview“details”。 我可以用一个datagridview“详细信息”来做到这一点,但当我按下父窗体上的其他详细信息按钮时,我将失去所有检查/取消选中。

有没有办法让每个datagridview“详细信息”直到最终录制?

我希望我的信息清晰而全面。

1 个答案:

答案 0 :(得分:1)

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

  • 您必须为每个付款方式行保留一组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]
     */