我有2个表格: 1.MainForm:
要求用户输入姓名,Family,然后有一个名为“付款明细”的按钮(打开Form2)。
2.Form2
用户输入付款明细并单击“保存”按钮。然后,此事务在sql表中插入新行,此表单将被关闭(步骤2)。虽然MainFrom仍处于打开状态,但我想,在用户点击MainForm上的Save按钮(步骤3)时,Form2的事务已提交,但如果用户关闭Main表单,则Form2事务支持回滚。
我很感激您对此方案的建议?
去抛出步骤1,2,3
答案 0 :(得分:1)
我认为你正在寻找这样的东西:
class MainForm()
{
private TransactionScope _scope;
public void SaveButton_Click()
{
_scope.Complete();
Close();
}
public MainForm()
{
_scope = new TransactionScope();
}
~MainForm()
{
_scope.Dispose();
}
}
但是,我强烈建议您不这样做。由于您可能需要等待很长时间才能完成输入,因此您将遇到有关事务生命周期和锁定数据库记录的各种问题。
根据您的需要,请考虑选择以下解决方案之一:
如果用户点击MainForm中的取消,只需再次删除创建的交易。
将输入的值从交易表单传递到主表单,并且只有在用户单击主表单的保存按钮时才保存交易。
答案 1 :(得分:0)
我的理解是,您的最终目标是保存在数据库名称和姓氏中,然后最终保存付款详细信息,例如日期和金额。出于自己的原因,您不会以两种不同的形式显示这些输入字段。因此,表格1可以保持不变。当表单2打开时,您需要阻止用户关闭Form1,直到单击表单2上的保存或取消。 对于这种情况有各种可能的方法,简单的方法是在表格2打开时直到表格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上找到此功能的参考。还有其他方法可以做到这一点,但这就是我现在想到的。请告诉我们。