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

C# 如何点击Form1的预定按钮随机将Form2的6个座位按钮设为红色

C#影院管理程序随机预定座位实现方案

实现逻辑说明

现有代码的核心问题是没有对座位做统一管理,也没有记录已选座位避免重复,修改方案如下:

  1. 在座位界面Form2中统一管理所有座位按钮和已预定状态
  2. 对外暴露预定方法供主界面Form1调用
  3. 每次预定从剩余可用座位中随机选取指定数量,标记为已预定

代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:45:02