【问题标题】:Save datagridview dynamically filled in C#保存用C#动态填充的datagridview
【发布时间】:2016-02-03 09:02:42
【问题描述】:

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

我必须在 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] |

当用户单击详细信息按钮时,我会显示一个带有其他 datagridview 的子表单,其中包含付款方式的详细信息。我在父表单中加载这样的表单:

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    |

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

在我的示例中,用户仅检查带有 33.90 的第二行,而不检查另一行。 当他们关闭此详细信息表单时,父 datagridview 更新如下:

    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 “详细信息”保存在 SQL 数据库(SQL Server)中。用户必须在这些付款之前输入其他信息,因此我认为的解决方案是将以前的数据保存在表“ENTRIES”中,然后检索 ID 最大值,并使用链接 ID_ENTRY 作为外键保存每个 datagridview“详细信息”。 我可以使用单个datagridview“详细信息”来做到这一点,但是当我按下父表单上的其他详细信息按钮时,我会丢失所有选中/取消选中。

有没有办法让每个 datagridview 的“细节”保持到最后的记录?

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

【问题讨论】:

    标签: c# sql-server dynamic datagridview


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。我已经找到了解决方案,但您的解决方案与我的非常相似。我创建了一个 datagridview 表,我使用 e.RowIndex 访问以了解我使用哪种付款方式。无论如何谢谢:)
    • 我很乐意提供帮助,即使只是为了确认您已经发现的内容。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多