我正在寻找一种方法来解决我的问题,与前一个问题相关。
我必须在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“详细信息”直到最终录制?
我希望我的信息清晰而全面。
答案 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]
*/