You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#多窗体数据传递求助:中间窗体跳转后数据回传至frm1文本框

嘿,我完全懂你的需求——中间窗体用来选支付方式,不管是打开现金还是信用卡窗体,点OK后都要把里面的文本框值传回主窗体frm1对吧?这里有几个实用的解决方案,你可以根据自己项目的规模和偏好来选:

方案1:使用委托事件(最推荐,解耦度最高)

这个方式让各个窗体之间不用直接依赖,符合面向对象的设计原则,以后要加新的支付方式也很方便。

步骤:

  1. 先在frm_cash和frm_credit里定义委托和事件(如果想更简洁,可以把这段抽成一个基类,让两个支付窗体继承):
// 在frm_cash中
public delegate void PaymentDataReceived(string amount);
public event PaymentDataReceived OnPaymentDataReceived;

// frm_credit中同样复制这段代码
  1. 在两个支付窗体的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();
}
  1. 在中间窗体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();
}
  1. 最后在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:使用公共静态变量(最简单,适合小型原型)

如果你的项目很小,不想搞复杂的事件,这个方式能快速实现需求,缺点是耦合度较高(子窗体直接依赖主窗体)。

步骤:

  1. 在frm1里定义一个公共静态的文本框引用(或者静态变量):
public static TextBox txtFrm1Public;

然后在frm1的Load事件里初始化这个引用:

private void frm1_Load(object sender, EventArgs e)
{
    txtFrm1Public = txtFrm1Target; // 替换成你要显示值的文本框名
}
  1. 在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和公共属性(清晰直观,适合中小型项目)

这个方式把支付窗体作为对话框打开,通过公共属性返回数据,中间窗体再把结果传给主窗体,逻辑清晰,耦合度也较低。

步骤:

  1. 在frm_cash和frm_credit里定义公共属性来存储文本框的值:
// frm_cash中
public string CashAmount { get; private set; }

// frm_credit中
public string CreditAmount { get; private set; }
  1. 在两个支付窗体的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();
}
  1. 在中间窗体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();
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:02:41