C# .NET技术问题:将新创建的巧克力订单对象传递回主窗体并显示
嘿,作为C#/.NET的新手,碰到这种跨窗体传对象的问题太正常啦!我给你整理了几个简单好上手的方法,帮你把Form1里创建的巧克力订单传到MainNavigation主窗体,还能在列表里显示出来~
方法一:公共属性+弹窗返回值(最适合新手的方案)
这个方法逻辑清晰,代码量少,完全适配你“在Form1创建订单后回到主窗体显示”的需求:
- 给Form1加个公共属性存订单
在Form1的代码里,定义一个公共属性用来保存用户创建好的Chocolate对象:
// Form1.cs public Chocolate NewChocolateOrder { get; private set; }
- Form1里创建订单并标记确认状态
在用户点击“生成订单”的按钮事件里,根据用户选择的类型创建Chocolate对象,赋值给上面的属性,然后告诉主窗体“我完成创建啦”:
private void btnCreateOrder_Click(object sender, EventArgs e) { // 这里根据你的界面控件获取用户选择的巧克力类型,比如下拉框 string selectedType = cboChocolateType.SelectedItem.ToString(); // 创建Chocolate对象,按需补充其他属性(比如价格、数量) NewChocolateOrder = new Chocolate { Type = selectedType, // Price = 10.99m, // Quantity = 1 }; // 设置弹窗的返回结果,告诉主窗体用户确认了这个订单 this.DialogResult = DialogResult.OK; this.Close(); }
- 主窗体MainNavigation接收订单并显示
在主窗体打开Form1的按钮事件里,用ShowDialog()打开弹窗,判断用户是否确认创建,然后把订单加到列表里:
// MainNavigation.cs // 先定义一个存储订单的集合(推荐用List,比数组灵活) private List<Chocolate> _chocolateOrders = new List<Chocolate>(); private void btnAddNewOrder_Click(object sender, EventArgs e) { using (var createOrderForm = new Form1()) { // 如果用户点击了确认(DialogResult.OK) if (createOrderForm.ShowDialog() == DialogResult.OK) { // 把新订单加到集合里 _chocolateOrders.Add(createOrderForm.NewChocolateOrder); // 刷新列表控件(比如用ListBox的话) // 建议给Chocolate类重写ToString(),这样直接加对象就能显示友好内容 listBoxOrders.Items.Add(createOrderForm.NewChocolateOrder); } } }
小优化:给Chocolate类重写ToString()
为了让列表显示的内容更友好,给你的Chocolate类加个ToString()重写:
public class Chocolate { public string Type { get; set; } // 其他属性比如Price、Quantity等 public override string ToString() { // 自定义显示内容,比如"黑巧克力 - 单价:10.99元" return $"巧克力类型:{Type}"; } }
方法二:事件委托(适合实时传递,不用关闭Form1)
如果想让Form1保持打开,用户可以连续创建多个订单,主窗体实时显示,就用事件委托的方式:
- Form1里定义订单创建事件
// Form1.cs // 定义一个事件,参数是创建好的Chocolate对象 public event EventHandler<Chocolate> ChocolateOrderCreated; private void btnCreateOrder_Click(object sender, EventArgs e) { string selectedType = cboChocolateType.SelectedItem.ToString(); var newOrder = new Chocolate { Type = selectedType }; // 触发事件,通知主窗体有新订单 ChocolateOrderCreated?.Invoke(this, newOrder); // 这里可以不关闭Form1,让用户继续创建 }
- 主窗体订阅事件并接收订单
// MainNavigation.cs private void btnOpenCreateForm_Click(object sender, EventArgs e) { var createOrderForm = new Form1(); // 订阅Form1的订单创建事件 createOrderForm.ChocolateOrderCreated += OnChocolateOrderCreated; createOrderForm.Show(); } // 事件处理方法,接收新订单并显示 private void OnChocolateOrderCreated(object sender, Chocolate e) { _chocolateOrders.Add(e); listBoxOrders.Items.Add(e); }
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

