初始化数据的先后顺序

以下是这段代码中存在的逻辑顺序分析:

1. InitRoomInfoData 方法中的逻辑问题

public void InitRoomInfoData()
{
    DataTable dt = _roomBLL.QueryRoom();
    DataRowCollection rows = dt.Rows;
    foreach (DataRow roomInfo in rows)
    {
        string rname = roomInfo[1].ToString();
        TabPage tabPage = new TabPage(rname);
        tabPage.Tag = roomInfo;
        tabControl2.TabPages.Add(tabPage);
        ShowDeskInfoByRoom();
    }
}
  • 问题:在创建每个 TabPage 后立即调用 ShowDeskInfoByRoom 方法,但此时 tabControl2.SelectedTab 可能并未正确指向新添加的 TabPage,导致后续获取 selectedTab 可能出现错误,从而影响桌台信息的显示。

2. ShowDeskInfoByRoom 方法中的错误

private void ShowDeskInfoByRoom()
{
    TabPage selectedTab = tabControl2.SelectedTab;
    DataRow roominfo = selectedTab.Tag as DataRow;
    Console.WriteLine(selectedTab.Controls[0]);
    ListView listView = selectedTab.Controls[0] as ListView;
    // ...
    selectedTab.Controls.Add(listView);
}
  • 空引用风险:在调用 selectedTab.Controls[0] 之前,没有检查 selectedTab.Controls 集合是否为空。如果集合为空,会抛出 ArgumentOutOfRangeException 异常。
  • 重复添加控件问题:代码中已经尝试从 selectedTab.Controls[0] 获取 ListView,之后又将其添加到 selectedTab.Controls 中,这可能会导致重复添加控件,造成显示异常。

3. btnBiling_Click 方法中的错误

private void btnBiling_Click(object sender, EventArgs e)
{
    TabPage selectedTab = tabControl2.SelectedTab;
    DataRow roomInfo = selectedTab.Tag as DataRow;

    ListView listView = new ListView();
    int count = listView.SelectedItems.Count;
    // ...
}
  • 创建新的 ListView 对象问题:这里创建了一个新的 ListView 对象,而不是使用 selectedTab 中的 ListView 控件。这会导致 listView.SelectedItems.Count 始终为 0,因为新创建的 ListView 没有选中项,从而使后续的桌台选择逻辑无法正常工作。

4. 异常处理不足

在多个方法中,如 Convert.ToInt32 等数据转换操作,没有进行异常处理。如果数据库中的数据类型不符合预期,会抛出 FormatExceptionInvalidCastException 等异常,影响程序的稳定性。例如:

int roomid = Convert.ToInt32(roominfo[0]);
orderDTO.RoomMinConsumption = Convert.ToInt32(roomInfo[2]);
orderDTO.DeskId = Convert.ToInt32(deskInfo[0]);
```<details>
<summary>点击查看代码</summary>

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using BLL;
using DAL;
using Model;

namespace UI
{
public partial class CateringShowForm : Form
{
private RoomBLL _roomBLL = new RoomBLL();
private CateringLoginForm _loginForm;
private DeskBLL _deskBLL = new DeskBLL();
public CateringShowForm()
{
InitializeComponent();
this.StartPosition = FormStartPosition.CenterScreen;
}
public CateringShowForm(CateringLoginForm cateringLoginForm) : this()
{

        _loginForm = cateringLoginForm;
    }

    private void CateringShowForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        _loginForm?.Close();
        Application.Exit();
    }
    public void ShowTime()
    {
        labTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
    }

    private void CateringShowForm_Load(object sender, EventArgs e)
    {

        ShowTime();  // 在窗体加载时立即显示当前时间
        timer1.Interval = 1000;  // 设置定时器的时间间隔为1000毫秒(1秒)
        timer1.Start();  // 启动定时器
        //展示包房信息
        InitRoomInfoData();

     

    }
    //初始化加载包房信息
    public void InitRoomInfoData()
    {

        DataTable dt = _roomBLL.QueryRoom();
        DataRowCollection rows = dt.Rows;
        foreach (DataRow roomInfo in rows)
        {
            string rname = roomInfo[1].ToString();
            //string rid = item[1].ToString();
            TabPage tabPage = new TabPage(rname);
            tabPage.Tag = roomInfo;
            tabControl2.TabPages.Add(tabPage);
            //object v = item[1];
            //object v1 = item[0];
            //Console.WriteLine(v + "   " + v1);
            ShowDeskInfoByRoom();

        }

    }
    private void timer1_Tick(object sender, EventArgs e)
    {
        ShowTime();  // 每次定时器触发时调用 ShowTime 方法
    }

    private void btnMemmber_Click(object sender, EventArgs e)
    {
        MemberShowForm memberShowForm = new MemberShowForm();
        memberShowForm.ShowDialog();

    }

    private void btnCategory_Click(object sender, EventArgs e)
    {
        ProductInfoShowForm productInfoShowForm = new ProductInfoShowForm();
        productInfoShowForm.ShowDialog();
    }
    //查询包房(标签页)显示桌台信息
    private void ShowDeskInfoByRoom()
    {

        TabPage selectedTab = tabControl2.SelectedTab;
        //获取包房信息
        DataRow roominfo = selectedTab.Tag as DataRow;//获取包房信息
        Console.WriteLine(selectedTab.Controls[0]);
        ListView listView = selectedTab.Controls[0] as ListView;//获取包房信息

        //获取包房id
        int roomid = Convert.ToInt32(roominfo[0]);
        Console.WriteLine(roomid + "================");
        //根据包房类别(标签页)查询包房信息
        DataTable dataTable = _deskBLL.QueryDeskInfoByRoomId(roomid);
        listView.Dock = DockStyle.Fill;//设置充满窗体
        listView.View = View.LargeIcon;//设置大图标
        listView.LargeImageList = imageList1;//设置大图标
        listView.MultiSelect = false;//设置单选
        foreach (DataRow deskInfo in dataTable.Rows)
        {
           
            Console.WriteLine(deskInfo[0] + " "+ deskInfo[1]  );
            ListViewItem listViewItem = new ListViewItem(deskInfo[2].ToString());//添加到列表中
            listViewItem.ImageIndex = Convert.ToInt32(deskInfo[4]);//设置图标
            listViewItem.Tag = deskInfo;//设置数据
            listView.Items.Add(listViewItem);

        }
        selectedTab.Controls.Add(listView);

    }
    //切换包房(标签页)的切换事件
    private void tabControl2_SelectedIndexChanged(object sender, EventArgs e)
    {
        ShowDeskInfoByRoom();
    }
    //定义事件
    public event EventHandler AddOrderEvent;
    //顾客开单的事件
    private void btnBiling_Click(object sender, EventArgs e)
    {
        TabPage selectedTab = tabControl2.SelectedTab;
        DataRow roomInfo = selectedTab.Tag as DataRow;

        ListView listView = new ListView();
        int count = listView.SelectedItems.Count;
        if (count == 0)
        {
            MessageBox.Show("请选择开单的桌台");
            return;
        }
        ListViewItem listViewItem = listView.SelectedItems[0];
        DataRow deskInfo = listViewItem.Tag as DataRow;
        if (Convert.ToInt32(deskInfo[4]) == 1)
        {
            MessageBox.Show("请选择空闲的桌台");
        }
        else
        {
            OrderAddForm orderAddForm = new OrderAddForm();//创建订单添加界面
            OrderDTO orderDTO = new OrderDTO();//创建订单数据传输对象
            orderDTO.RoomId = Convert.ToInt32(roomInfo[0]);//设置房间编号
            orderDTO.RoomName = roomInfo[1].ToString();//设置房间名称

            Console.WriteLine(roomInfo[2]);//设置房间消费
            orderDTO.RoomMinConsumption = Convert.ToInt32(roomInfo[2]);//设置房间最低消费

            orderDTO.DeskId = Convert.ToInt32(deskInfo[0]);//设置桌台编号
            orderDTO.DeskName = deskInfo[2].ToString();//设置桌台名称
            //订阅订单添加界面的获取数据事件
            AddOrderEvent += orderAddForm.SetData;
            //发布事件
            AddOrderEvent.Invoke(this, orderDTO);

            orderAddForm.ShowDialog();//显示订单添加界面

        }
    }

}

}

</details>
posted @ 2025-02-19 22:13  世界改变程序员  阅读(31)  评论(0)    收藏  举报