C#多窗体数据传递求助:中间窗体跳转后数据回传至frm1文本框
嘿,我完全懂你的需求——中间窗体用来选支付方式,不管是打开现金还是信用卡窗体,点OK后都要把里面的文本框值传回主窗体frm1对吧?这里有几个实用的解决方案,你可以根据自己项目的规模和偏好来选:
方案1:使用委托事件(最推荐,解耦度最高)
这个方式让各个窗体之间不用直接依赖,符合面向对象的设计原则,以后要加新的支付方式也很方便。
步骤:
- 先在
frm_cash和frm_credit里定义委托和事件(如果想更简洁,可以把这段抽成一个基类,让两个支付窗体继承):
// 在frm_cash中 public delegate void PaymentDataReceived(string amount); public event PaymentDataReceived OnPaymentDataReceived; // frm_credit中同样复制这段代码
- 在两个支付窗体的OK按钮点击事件里,触发事件并传入文本框的值:
// frm_cash的OK按钮事件 private void btnOK_Click(object sender, EventArgs e) { // 触发事件,传递金额 OnPaymentDataReceived?.Invoke(txtCashAmount.Text); this.DialogResult = DialogResult.OK; this.Close(); } // frm_credit的OK按钮事件同理,替换成自己的文本框控件名 private void btnOK_Click(object sender, EventArgs e) { OnPaymentDataReceived?.Invoke(txtCreditAmount.Text); this.DialogResult = DialogResult.OK; this.Close(); }
- 在中间窗体
frm_payment_choice里,定义一个传递最终数据的事件,然后在打开支付窗体时订阅它们的事件,把数据透传出去:
// 中间窗体的事件定义 public delegate void FinalPaymentDataReceived(string amount); public event FinalPaymentDataReceived OnFinalPaymentDataReceived; // 选择现金的按钮点击事件 private void btnCash_Click(object sender, EventArgs e) { frm_cash cashForm = new frm_cash(); // 订阅现金窗体的事件 cashForm.OnPaymentDataReceived += (amount) => { OnFinalPaymentDataReceived?.Invoke(amount); }; cashForm.ShowDialog(); } // 选择信用卡的按钮点击事件同理 private void btnCredit_Click(object sender, EventArgs e) { frm_credit creditForm = new frm_credit(); creditForm.OnPaymentDataReceived += (amount) => { OnFinalPaymentDataReceived?.Invoke(amount); }; creditForm.ShowDialog(); }
- 最后在
frm1里,打开中间窗体时订阅它的事件,把值显示到文本框:
private void btnOpenPaymentChoice_Click(object sender, EventArgs e) { frm_payment_choice choiceForm = new frm_payment_choice(); choiceForm.OnFinalPaymentDataReceived += (amount) => { // 把收到的金额显示到frm1的文本框 txtFrm1Target.Text = amount; }; choiceForm.ShowDialog(); }
方案2:使用公共静态变量(最简单,适合小型原型)
如果你的项目很小,不想搞复杂的事件,这个方式能快速实现需求,缺点是耦合度较高(子窗体直接依赖主窗体)。
步骤:
- 在
frm1里定义一个公共静态的文本框引用(或者静态变量):
public static TextBox txtFrm1Public;
然后在frm1的Load事件里初始化这个引用:
private void frm1_Load(object sender, EventArgs e) { txtFrm1Public = txtFrm1Target; // 替换成你要显示值的文本框名 }
- 在
frm_cash和frm_credit的OK按钮事件里,直接给静态文本框赋值:
// frm_cash的OK按钮 private void btnOK_Click(object sender, EventArgs e) { frm1.txtFrm1Public.Text = txtCashAmount.Text; this.Close(); } // frm_credit的OK按钮同理 private void btnOK_Click(object sender, EventArgs e) { frm1.txtFrm1Public.Text = txtCreditAmount.Text; this.Close(); }
方案3:使用DialogResult和公共属性(清晰直观,适合中小型项目)
这个方式把支付窗体作为对话框打开,通过公共属性返回数据,中间窗体再把结果传给主窗体,逻辑清晰,耦合度也较低。
步骤:
- 在
frm_cash和frm_credit里定义公共属性来存储文本框的值:
// frm_cash中 public string CashAmount { get; private set; } // frm_credit中 public string CreditAmount { get; private set; }
- 在两个支付窗体的OK按钮事件里,给属性赋值并设置DialogResult:
// frm_cash的OK按钮 private void btnOK_Click(object sender, EventArgs e) { CashAmount = txtCashAmount.Text; this.DialogResult = DialogResult.OK; this.Close(); } // frm_credit的OK按钮同理 private void btnOK_Click(object sender, EventArgs e) { CreditAmount = txtCreditAmount.Text; this.DialogResult = DialogResult.OK; this.Close(); }
- 在中间窗体
frm_payment_choice里,定义公共属性存储最终金额,打开支付窗体后判断返回结果:
public string FinalPaymentAmount { get; private set; } // 现金按钮点击事件 private void btnCash_Click(object sender, EventArgs e) { frm_cash cashForm = new frm_cash(); if (cashForm.ShowDialog() == DialogResult.OK) { FinalPaymentAmount = cashForm.CashAmount; this.DialogResult = DialogResult.OK; this.Close(); } } // 信用卡按钮点击事件同理 private void btnCredit_Click(object sender, EventArgs e) { frm_credit creditForm = new frm_credit(); if (creditForm.ShowDialog() == DialogResult.OK) { FinalPaymentAmount = creditForm.CreditAmount; this.DialogResult = DialogResult.OK; this.Close(); } }
- 在
frm1里打开中间窗体,获取结果并显示:
private void btnOpenPaymentChoice_Click(object sender, EventArgs e) { frm_payment_choice choiceForm = new frm_payment_choice(); if (choiceForm.ShowDialog() == DialogResult.OK) { txtFrm1Target.Text = choiceForm.FinalPaymentAmount; } }
内容的提问来源于stack exchange,提问作者Leonard Gashi
相关产品推荐
相关产品推荐

