2.2.4 留票
查询按钮可以查询对应班次的座位信息,显示对应座位的图片,如果座位处于空的状态,就可以留票,右击座位图片进行留票和取消留票,右边DGV显示的是对应班次所留的票的一些基本信息
2.2.4(图1)
从图 2.1(图1)上可以看到我们这里用到的控件有
控件名称 |
说明 |
文字(label) |
控件可以在工具箱直接拖动至窗体,拖至窗体后右击属性可以修改控件的样式和各种属性,还可以编辑事件。右击控件选择属性,在跳出框里面选择带有雷电的图标,在里面可以选择属性 |
下拉框(ComboBox) | |
文本(TextBox) | |
按钮(Button) | |
容器(panel) | |
表格(DataGridView) |
数据库
1、表与关系
2.2.4(图2)
表1.车辆表(VehicleList)
列名 |
数据类型 |
主键/外键 |
说明 |
VehicleID |
int |
主键 |
车辆ID |
VehicleNumber |
char (100) |
Yes |
车辆编号 |
VehicleBlockNumber |
char (100) |
Yes |
车牌号 |
VehicleStateID |
int |
外键 |
车辆状态表.车辆状态ID |
MotorcadeID |
int |
外键 |
车队表.车队ID |
VehicleClearID |
int |
外键 |
车辆明细表.车辆明细ID |
VehicleTypeID |
int |
外键 |
车型表.车型ID |
DriverID |
int |
外键 |
司机表.司机ID |
DeputyDriverOneID |
int |
外键 |
司机表.副司机1ID |
DeputyDriverTwoID |
int |
外键 |
司机表.副司机2ID |
StationID |
int |
外键 |
站点表.车站ID |
LineID |
int |
外键 |
线路表.线路ID |
OpenVehicleTime |
datetime |
|
发车时间 |
ASeatNumberID |
int |
外键 |
座号表.座号ID |
FeeRateID |
int |
外键 |
费用表.费用ID |
SeatNumber |
char (100) |
|
座位数 |
AddSeatNumber |
char (100) |
|
加座数 |
Remarks |
char (100) |
|
备注 |
ClassesLongStopID |
int |
外键 |
班次长停表.班次长停ID |
ClassesRepeatID |
int |
外键 |
扣费表.扣费ID |
Classes |
char (100) |
|
班次 |
OpenVehicleSiteID |
int |
外键 |
站点表.发车站 ID |
EndVehicleSiteID |
int |
外键 |
站点表.终点站ID |
DeductFeeNo |
bit |
|
扣费否 |
MotorNumber |
char (100) |
|
车队编号 |
VehicleAlterTypeCase |
char (100) |
|
车辆改型情况 |
WhetherCheck |
char (100) |
|
安检情况 |
SafeCheckNo |
bit |
|
安检否 |
表2.座位表(ASeatNumberList)
列名 |
数据类型 |
主键/外键 |
说明 |
ASeatNumberID |
int - Identity |
主键 |
座号ID |
ASeatNumber |
char (10) |
|
座号 |
VehicleID |
int |
外键 |
车辆表.车辆ID |
SeatStateID |
int |
外键 |
座位状态表.座位状态ID |
UserNo |
bit |
|
有用否 |
LinkNo |
bit |
|
连接否 |
表3.票号表(TicketNumberList)
列名 |
数据类型 |
主键/外键 |
说明 |
TicketNumberID |
int |
主键 |
票号ID |
TicketNumber |
char (100) |
|
票号 |
ASeatNumberID |
int |
外键 |
座位表.座号ID |
UserNo |
bit |
|
有用否 |
表4.用户表(dbo.UserList)
列名 |
数据类型 |
主键/外键 |
说明 |
UserID |
int |
主键 |
用户ID |
UserNumber |
char (100) |
|
用户编码 |
StaffID |
int |
外键 |
员工表.员工ID |
WorkValue |
char (100) |
|
工价 |
LimitsOfAuthorityGroupID |
int |
外键 |
权限组表.权限组ID |
Password |
char (100) |
|
密码 |
Remarks |
char (100) |
|
备注 |
StopUseNo |
bit |
|
停用否 |
表5.员工表(dbo.StaffList)
列名 |
数据类型 |
主键/外键 |
说明 |
StaffID |
int |
主键 |
员工ID |
StaffNumber |
char (100) |
|
员工编号 |
StaffName |
char (100) |
|
员工姓名 |
Sex |
char (100) |
|
性别 |
IdentityCardNumber |
char (100) |
|
身份证号 |
HomeLocation |
char (100) |
|
家庭地址 |
Phone |
char (100) |
|
电话 |
StaffTypeID |
int |
外键 |
员工类型表.员工类型ID |
OrganizationID |
int |
外键 |
机构表.机构ID |
StationID |
int |
外键 |
站点表.站点ID |
Remarks |
char (100) |
|
备注 |
LeaveOfficeNo |
bit |
|
离职否 |
InvokingNo |
bit |
|
调用否 |
Date |
datetime |
|
日期 |
Photo |
nvarchar (3000) |
|
相片 |
表6.票号表(TicketNumberList)
列名 |
数据类型 |
主键/外键 |
说明 |
TicketNumberID |
int |
主键 |
票号ID |
TicketNumber |
char (100) |
|
票号 |
ASeatNumberID |
int |
外键 |
座位表.座号ID |
UserNo |
bit |
|
有用否 |
表7.线路表(LineList)
列名 |
数据类型 |
主键/外键 |
说明 |
LineID |
int - Identity |
主键 |
线路ID |
LineName |
char (100) |
|
线路名称 |
VehicleID |
int |
外键 |
车辆表.车辆ID |
Remarks |
char (100) |
|
备注 |
StopNo |
bit |
|
停用否 |
表8.留票表(StayTicketList)
列名 |
数据类型 |
主键/外键 |
说明 |
StayTicketID |
int - Identity |
主键 |
留票ID |
Remarks |
char (100) |
|
备注 |
ASeatNumberID |
int |
外键 |
座位表.座位ID |
StayTicketTime |
datetime |
|
留票时间 |
StayTicketSatffID |
int |
外键 |
员工表.留票员ID |
1.下拉框的绑定请查看登陆界面的实现,查询的实现请查看售票管理(库存/取票),dgv的绑定请查看售票管理(退票)
2.座位图片的显示留票的实现
2.2.4(图3)
第一步:数据库的存储过程
@TYPE CHAR(100)='',
@StayTicketID INT=0,
@Remarks CHAR(100)='',
@ASeatNumberID INT=0,
@StayTicketTime DATETIME='',
@StayTicketSatffID INT=0,
IF @TYPE='frmStayTicket_SelectAseatPhoto'--绑定座位图片
BEGIN
SELECT ASeatNumberList.ASeatNumber, VehicleList.Classes, ASeatNumberList.SeatStateID, ASeatNumberList.ASeatNumberID, VehicleList.VehicleID, OutVehicleList.OutVehicleID
FROM ASeatNumberList INNER JOIN
VehicleList ON ASeatNumberList.VehicleID = VehicleList.VehicleID INNER JOIN
OutVehicleList ON VehicleList.VehicleID = OutVehicleList.VehicleID
WHERE OutVehicleList.UserTo=1 and VehicleList.DeductFeeNo=0--当有用否等于TRUE时
END
IF @TYPE='frmStayTicket_SelectAseatPhotoID'--获取新增座位的ID
BEGIN
SELECT ASeatNumberList.ASeatNumber, VehicleList.Classes, ASeatNumberList.SeatStateID, ASeatNumberList.ASeatNumberID, VehicleList.VehicleID
FROM ASeatNumberList INNER JOIN
VehicleList ON ASeatNumberList.VehicleID = VehicleList.VehicleID
WHERE ASeatNumberList.ASeatNumberID=@ASeatNumberID
END
IF @TYPE='frmStayTicket_InsertStayTicket' --新增留票
BEGIN
INSERT INTO StayTicketList(Remarks, ASeatNumberID, StayTicketTime, StayTicketSatffID,ClientID)
VALUES (@Remarks, @ASeatNumberID, @StayTicketTime, @StayTicketSatffID,@ClientID)
END
IF @TYPE='frmStayTicket_UpdateSeatStaue'--修改座位状态
BEGIN
UPDATE ASeatNumberList
SET SeatStateID=5
WHERE ASeatNumberList.ASeatNumberID=@ASeatNumberID
END
第二步:逻辑层(BLL)代码
[OperationContract]
public DataSet frmStayTicket_SelectAseatPhoto()//绑定图片
{
SqlParameter[] mySqlParameter = { new SqlParameter("@Type", SqlDbType.Char) };
mySqlParameter[0].Value = "frmStayTicket_SelectAseatPhoto";
DataTable myDataTable = myDALMethod.QueryDataTable("SellTicketManage_frmStayTicket", mySqlParameter);
DataSet myDataSet = new DataSet();
myDataSet.Tables.Add(myDataTable);
return myDataSet;
}
[OperationContract]
public int frmStayTicket_InsertStayTicket(string strRemarks, int intASeatNumberID, DateTime dtStayTicketTime, int intStayTicketSatffID)//新增留票
{
SqlParameter[] mySqlParameter = { new SqlParameter("@Type", SqlDbType.Char),
new SqlParameter("@Remarks", SqlDbType.Char),
new SqlParameter("@ASeatNumberID", SqlDbType.Char),
new SqlParameter("@StayTicketTime", SqlDbType.Char),
new SqlParameter("@StayTicketSatffID", SqlDbType.Char)};
mySqlParameter[0].Value = "frmStayTicket_InsertStayTicket";
mySqlParameter[1].Value = strRemarks;
mySqlParameter[2].Value = intASeatNumberID;
mySqlParameter[3].Value = dtStayTicketTime;
mySqlParameter[4].Value = intStayTicketSatffID;
return myDALMethod.UpdateData("SellTicketManage_frmStayTicket", mySqlParameter);
}
[OperationContract]
public int frmStayTicket_UpdateSeatStaue(int intASeatNumberID)//修改座位状态
{
SqlParameter[] mySqlParameter = { new SqlParameter("@Type", SqlDbType.Char),
new SqlParameter("@ASeatNumberID", SqlDbType.Char),};
mySqlParameter[0].Value = "frmStayTicket_UpdateSeatStaue";
mySqlParameter[1].Value = intASeatNumberID;
return myDALMethod.UpdateData("SellTicketManage_frmStayTicket", mySqlParameter);
}
第三步:界面层(UIL)代码
private void VehiclePhoto(DataTable dtClasses)//显示座位图片的方法(解说请查看售票管理(售票))
{
pnlVehicle.Controls.Clear();//设置panel为空
for (int RowsIndex = 0, leftX = 50, leftY = 50; RowsIndex < dtVehicle.Rows.Count; RowsIndex++)//声明一个整形,一个横坐标和一个纵坐标,设置值的范围
{
int RowsCount = RowsIndex / 4;//一行有4个
if (RowsIndex % 4 == 0)//取/4的余数
{
leftX = 10;//与左边的距离
}
else if (RowsIndex != 0)//如果声明的整形不等于0
{
leftX += 90;//两图片宽的距离
}
leftY = 12 + RowsCount * 85;//(8) 与顶点的距离(35)两图片高的距离
Button btn = new Button();
btn.Name = dtVehicle.Rows[RowsIndex]["VehicleBlockNumber"].ToString().Trim();
btn.Tag = Convert.ToInt32(dtVehicle.Rows[RowsIndex]["VehicleID"].ToString().Trim());
btn.Location = new Point(leftX, leftY);
btn.Text = "车牌号:" + dtVehicle.Rows[RowsIndex]["VehicleBlockNumber"].ToString()
+ "\n 班次:" + dtVehicle.Rows[RowsIndex]["Classes"].ToString()
+ "\n 线路:" + dtVehicle.Rows[RowsIndex]["LineName"].ToString();//车辆图片中显示的数据
btn.ForeColor = Color.OrangeRed;//设置字体颜色
btn.Font = new Font("宋体", 8, FontStyle.Bold);//字体大小
btn.Size = new Size(80, 65);//
btn.TextAlign = ContentAlignment.TopLeft;
btn.BackgroundImageLayout = ImageLayout.Center;//图片出现的位置
btn.BackgroundImage = imgVehicle.Images["001.png"];
this.pnlVehicle.Controls.Add(btn);
btn.MouseDown += new MouseEventHandler(btn_MouseDown);//鼠标按下事件(在控件上按下鼠标键事件,调用事件)
btn.MouseEnter += new EventHandler(btn_MouseEnter);//鼠标移动到时发生
btn.MouseLeave += new EventHandler(btn_MouseLeave);//鼠标离开时发生
}
}
void btn_MouseEnter(object sender, EventArgs e)//座位图片鼠标到达时发生(图片变大,)
{
Button btnOne = sender as Button;
PublicStaticObject.intAseatID = Convert.ToInt32(btnOne.Tag);
btnOne.ForeColor = Color.MediumVioletRed;/图片中字体颜色改变
btnOne.Size = new Size(55, 50);//改变图片的大小
btnOne.BackgroundImageLayout = ImageLayout.Zoom;
PublicStaticObject.intSeatTicKetNumber = Convert.ToInt32(btnOne.Tag);
}
void btn_MouseLeave(object sender, EventArgs e)//车辆图片鼠标离开(图片变小)
{
Button btn = sender as Button;
int intVehicleID = Convert.ToInt32(btn.Tag);
btn.ForeColor = Color.OrangeRed;//图片中字体颜色改变
btn.Size = new Size(45, 40);//改变图片的大小
}
private void 留票ToolStripMenuItem_Click(object sender, EventArgs e)//右键功能留票
{
try
{
DataTable dtphotoOne = myfrmStayTicketClient.frmStayTicket_SelectAseatPhotoID(PublicStaticObject.intAseatID).Tables[0];
if ((int)dtphotoOne.Rows[0]["SeatStateID"] == 3)//判断,当座位状态等于空时,可以留票
{
DialogResult dr = MessageBox.Show("确定要留票?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);//提示框
if (dr == DialogResult.OK)//当按下提示框中(是)时
{
if (txtRemarks.Text == "")
{
MessageBox.Show("备注不能为空!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
if (MessageBox.Show("确定留备注为(" + txtRemarks.Text + "\n)的票?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk) == DialogResult.OK)
{
DataTable dtphoto = myfrmStayTicketClient.frmStayTicket_SelectAseatPhotoID(PublicStaticObject.intAseatID).Tables[0];//获取数据
string strRemarks = txtRemarks.Text.ToString().Trim();
int intBillID = (int)dtphoto.Rows[0]["ASeatNumberID"];
DateTime dtStayTicketTime = DateTime.Now;
int intStayTicketSatffID = PublicStaticObject.UserID;
int i = myfrmStayTicketClient.frmStayTicket_InsertStayTicket(strRemarks, intBillID, dtStayTicketTime, intStayTicketSatffID);
if (i > 0)
{
string KnowName = "于" + dtStayTicketTime + "留一张班次为" + cboClassesNumber.Text.ToString().Trim() +"的票";//信息提示
myfrmMainClient.frmMain_InsertKnow(KnowName);
MessageBox.Show("留票成功!");
myfrmStayTicketClient.frmStayTicket_UpdateSeatStaue(PublicStaticObject.intAseatID);//修改座位状态
btnSearch_Click(null, null);//刷新
}
else
{
MessageBox.Show("操作错误!");
}
}
}
}
else
{
MessageBox.Show("该座位无法留票!");
}
}
catch { }
}
3.取消留票的实现
2.2.4(图4)
第一步:数据库的存储过程
IF @TYPE='frmStayTicket_UpdateSeatStaueOne'--修改座位状态(取消留票)
BEGIN
UPDATE ASeatNumberList
SET SeatStateID=3--修改座位的状态等于空
WHERE ASeatNumberList.ASeatNumberID=@ASeatNumberID
END
第二步:逻辑层(BLL)代码
[OperationContract]
public int frmStayTicket_UpdateSeatStaueOne(int intASeatNumberID)//修改座位状态(取消留票)
{
SqlParameter[] mySqlParameter = { new SqlParameter("@Type", SqlDbType.Char),
new SqlParameter("@ASeatNumberID", SqlDbType.Char),};
mySqlParameter[0].Value = "frmStayTicket_UpdateSeatStaueOne";
mySqlParameter[1].Value = intASeatNumberID;
return myDALMethod.UpdateData("SellTicketManage_frmStayTicket", mySqlParameter);
}
第三步:界面层(UIL)代码
private void 取消留票ToolStripMenuItem_Click(object sender, EventArgs e)//右键取消留票
{
try
{
DataTable dtphotoOne = myfrmStayTicketClient.frmStayTicket_SelectAseatPhotoID(PublicStaticObject.intAseatID).Tables[0];//获取一条数据
if ((int)dtphotoOne.Rows[0]["SeatStateID"] == 5)//判断座位状态是否是留
{
DialogResult dr = MessageBox.Show("确定要取消留票?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);//提示框,
if (dr == DialogResult.OK)//提示框按是时执行
{
int i =
myfrmStayTicketClient.frmStayTicket_UpdateSeatStaueOne(PublicStaticObject.intAseatID);
if (i > 0)
{
DataTable DT = myfrmStayTicketClient.frmStayTicket_SelectStayTicket(PublicStaticObject.intAseatID).Tables[0];
int StayTicketID = (int)DT.Rows[0]["StayTicketID"];
myfrmStayTicketClient.frmStayTicket_UpdateStayTicket(StayTicketID);
MessageBox.Show("取消成功!");
btnSearch_Click(null, null);
}
else
{
MessageBox.Show("操作错误!");//提示框
}
}
}
else
{
MessageBox.Show("该座位不在留票状态!");
}
}
catch { }
}
仅供学习,禁止用于商业用途