初始化数据的先后顺序
以下是这段代码中存在的逻辑顺序分析:
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 等数据转换操作,没有进行异常处理。如果数据库中的数据类型不符合预期,会抛出 FormatException 或 InvalidCastException 等异常,影响程序的稳定性。例如:
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>

浙公网安备 33010602011771号