C# 如何点击Form1的预定按钮随机将Form2的6个座位按钮设为红色
C#影院管理程序随机预定座位实现方案
实现逻辑说明
现有代码的核心问题是没有对座位做统一管理,也没有记录已选座位避免重复,修改方案如下:
- 在座位界面Form2中统一管理所有座位按钮和已预定状态
- 对外暴露预定方法供主界面Form1调用
- 每次预定从剩余可用座位中随机选取指定数量,标记为已预定
代码实现
Form2(座位界面)代码
using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; public partial class Form2 : Form { // 存储所有21个座位按钮 private readonly List<Button> _allSeats = new List<Button>(); // 存储已经被预定的座位,避免重复选择 private readonly HashSet<Button> _reservedSeats = new HashSet<Button>(); private readonly Random _random = new Random(); public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { // 筛选所有座位按钮加入集合,要求你的座位按钮名称统一以seatButton为前缀,例如seatButton1~seatButton21 // 如果不想按名称筛选,也可以手动逐个Add到_allSeats列表 _allSeats.AddRange(this.Controls.OfType<Button>().Where(b => b.Name.StartsWith("seatButton"))); // 初始化所有座位为未预定状态(背景色白色) foreach (var seat in _allSeats) { seat.BackColor = Color.White; } } /// <summary> /// 对外公开的随机预定座位方法 /// </summary> /// <param name="reserveCount">需要预定的座位数,默认6个</param> /// <returns>是否预定成功</returns> public bool ReserveRandomSeats(int reserveCount = 6) { // 筛选当前未被预定的座位 var availableSeats = _allSeats.Except(_reservedSeats).ToList(); // 剩余座位不足时提示并返回失败 if (availableSeats.Count < reserveCount) { MessageBox.Show($"剩余座位不足{reserveCount}个,无法完成预定"); return false; } // 随机打乱可用座位,取前reserveCount个 var selectedSeats = availableSeats.OrderBy(_ => _random.Next()).Take(reserveCount).ToList(); // 标记选中座位为已预定 foreach (var seat in selectedSeats) { seat.BackColor = Color.Red; _reservedSeats.Add(seat); } return true; } }
Form1(主界面)代码
using System.Windows.Forms; public partial class Form1 : Form { // 持有Form2的全局实例,避免每次打开座位界面丢失预定记录 private readonly Form2 _seatForm = new Form2(); public Form1() { InitializeComponent(); } // 打开座位界面按钮的点击事件(如果你有这个按钮的话) private void openSeatFormBtn_Click(object sender, EventArgs e) { _seatForm.Show(); } // 预定按钮点击事件 private void reserve_button_Click(object sender, EventArgs e) { // 调用Form2的预定方法 _seatForm.ReserveRandomSeats(); } }
注意事项
- 若你的座位按钮命名没有统一前缀,可以在Form2_Load中手动把21个座位按钮逐个添加到_allSeats列表
- 如果需要支持取消预定,可给座位按钮添加点击事件,判断如果是已预定状态就把背景色改回白色,同时从_reservedSeats集合中移除对应按钮
- 若你需要每次重启程序都保留预定记录,可以把已预定座位的编号存储到本地文件/数据库中,程序启动时读取恢复状态
内容的提问来源于stack exchange,提问作者Jfern32
相关产品推荐
相关产品推荐

