-2

我有 2 个表格: 在此处输入图像描述 1.MainForm :

其中要求用户输入姓名,Family,然后有一个名为“付款明细”的按钮(打开 Form2)。

2.Form2

用户输入付款明细,然后单击保存按钮。然后这个事务在 sql 表中插入新行,这个表单将被关闭(步骤 2)。虽然 MainFrom 仍处于打开状态,但我想,在用户单击 MainForm 上的 Save 按钮(步骤 3)时,Form2 的事务已提交,但如果用户关闭主窗体,则 Form2 事务将回滚。

我会很感激你对这种情况的建议?

去扔步骤 1,2,3

4

2 回答 2

1

我想你正在寻找这样的东西:

class MainForm()
{
    private TransactionScope _scope;
    public void SaveButton_Click()
    {
        _scope.Complete();
        Close();
    }
    public MainForm()
    {
        _scope = new TransactionScope();
    }
    ~MainForm()
    {
        _scope.Dispose();
    }
}

但是,我强烈建议您要这样做。由于您可能需要等待很长时间才能让用户完成输入,因此您将遇到事务生命周期和锁定数据库记录的各种问题。

根据您的需要,请考虑选择以下解决方案之一:

  • 如果用户在 MainForm 中单击取消,只需再次删除创建的 Transaction。

  • 将输入的值从交易表单传递到主表单,并且仅当用户单击主表单的保存按钮时才保存交易。

于 2013-09-30T12:32:23.480 回答
0

我的理解是,您的最终目标是保存数据库名称姓氏,然后最终还保存付款详细信息 ,例如date 和 amount。由于您自己的原因,您不会以两种不同的形式显示这些输入字段。因此,Form 1 可以保持原样。当 Form 2 打开时,您需要阻止用户关闭 Form1,直到单击 Form 2 上的保存或取消。这种情况有多种可能的方法,最简单的一种方法是在 Form 2 打开时从 Form 1 中删除关闭按钮。为此,您可以实现以下内容:

private const int CP_NOCLOSE_BUTTON = 0x200;
protected override CreateParams CreateParams
{
   get
  {
   CreateParams myCp = base.CreateParams;
   myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON ;
   return myCp;
  }
}

上面的参考是codeproject

另一种选择可能是使您的 Form1 和 Form 2 在屏幕上不可移动并相互重叠,以便用户无法访问 Form 1 的关闭按钮,因此他被迫关闭 Form 2 以访问 Form 1。此类参考功能可以在这里找到SO。还有其他方法可以完成上述操作,但这是我现在想到的。让我们知道。

于 2013-09-30T11:53:49.257 回答