📄 roomstatus.cs
字号:
public void AutoSizeGrid()
{
int numRows = ((DataTable)dataGrid1.DataSource).Rows.Count; //该dataGrid所连接的表的宽度
Graphics g = Graphics.FromHwnd(dataGrid1.Handle);
StringFormat sf = new StringFormat(StringFormat.GenericTypographic);
SizeF size;
//由于DataGrid没有提供对DataGridRows[]的直接调用,因此我们使用一个反射(relection)来实现它
//这个方法实际上取得dataGrid中行的集合,通过get_DataGridRows方法返回Rows的集合
//并转化为一个System.Array对象
MethodInfo mi = dataGrid1.GetType().GetMethod("get_DataGridRows",
BindingFlags.FlattenHierarchy | BindingFlags.IgnoreCase | BindingFlags.Instance
| BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
System.Array dgra = (System.Array)mi.Invoke(dataGrid1,null);
// 将其转换为ArrayList
ArrayList DataGridRows = new ArrayList();
foreach (object dgrr in dgra)
{
if (dgrr.ToString().EndsWith("DataGridRelationshipRow")==true)
DataGridRows.Add(dgrr);
}
//枚举dataGrid中的所有行
for (int i = 0; i < numRows; ++i)
{
size = g.MeasureString(dataGrid1[i,1].ToString(),dataGrid1.Font,400,sf);
int h = Convert.ToInt32(32);//直接将每行的行高设置为40
//用下面这行代码可以根据dataGrid中字体自动调整行高
//int h = Convert.ToInt32(size.Height);
// 将定好的行高设置回dataGrid中
PropertyInfo pi = DataGridRows[i].GetType().GetProperty("Height");
pi.SetValue(DataGridRows[i],h,null);
}
g.Dispose();
}
//----------设置一个16*4的表格,以显示房态图----------
private void DataGridStateControl()
{
roomTable = new DataTable();
for(int i=1;i<17;i++)//添加16列,以显示16个房间
{
roomTable.Columns.Add(i.ToString(),typeof(string));
}
this.dataGrid1.DataSource = roomTable;
for(int i=0;i<4;i++)//向表中添加4行,显示4层楼
{
roomTable.Rows.Add(roomTable.NewRow());
}
DataGridTableStyle ts = new DataGridTableStyle();
DataGridTextBoxColumn aColumnTextColumn;
ts.AllowSorting = false;
ts.MappingName = roomTable.TableName;
ts.RowHeadersVisible=false;
for (int j = 0;j< 16;j++)
{
aColumnTextColumn = new DataGridTextBoxColumn();
aColumnTextColumn.ReadOnly=true;
aColumnTextColumn.Width=32;
aColumnTextColumn.MappingName = roomTable.Columns[j].ColumnName;
aColumnTextColumn.HeaderText = roomTable.Columns[j].ColumnName;
aColumnTextColumn.NullText = "";
aColumnTextColumn.Format = "N"; //设置为数字格式显示
ts.GridColumnStyles.Add(aColumnTextColumn);
}
dataGrid1.TableStyles.Add(ts);
}
//-------重画房态图---------
private void dataGrid1_Paint(object sender, PaintEventArgs e)
{
if(this.statusTable.Rows.Count==0)
{
return;
}
string status;//房屋状态
int floor,roomNum;//楼层和房间号
Image pic=imageList1.Images[0];//显示的图像
foreach(DataRow aRow in statusTable.Rows)
{
floor=Convert.ToInt32(aRow["楼层编号"]);
roomNum=Convert.ToInt32(aRow["客房编号"])-100*floor;
if(roomNum>14)//还原避开的两个忌讳数字13,14后的编号
roomNum=roomNum-2;
status=aRow["状态"].ToString().Trim();
switch(status)//根据不同状态,确定不同图片
{
case "将到":
pic=imageList1.Images[0];
break;
case "将离":
pic=imageList1.Images[1];
break;
case "空房":
pic=imageList1.Images[2];
break;
case "维修":
pic=imageList1.Images[3];
break;
case "住房":
pic=imageList1.Images[4];
break;
case "自用":
pic=imageList1.Images[5];
break;
}
e.Graphics.DrawImage(pic,2+32*(roomNum-1),2+32*(floor-3));
e.Graphics.DrawString(aRow["客房编号"].ToString().Trim(),Font,SystemBrushes.WindowText,4+32*(roomNum-1),24+32*(floor-3));
}
}
//----------更新房态数据---------
private void RefreshStatus(string sql)
{
string strConn="workstation id=localhost;Integrated Security=SSPI;Database=hotelbook;";
SqlConnection cn=new SqlConnection(strConn);
cn.Open();
SqlDataAdapter da=new SqlDataAdapter(sql,cn);
this.statusTable.Clear();
da.Fill(this.statusTable);
}
//---------单击一个房间图标时,显示其房号和类型,以及状态-----------
private void dataGrid1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
int col=dataGrid1.CurrentCell.ColumnNumber;
int row=dataGrid1.CurrentCell.RowNumber;
row=row+3;//楼层编号从3楼开始
col=col+1;//房间编号从1开始
if(col>12)//房屋编号中没有13,14这两个编号,是向后顺延的
{
col=col+2;
}
string roomID="";//房间编号
if(col.ToString().Length==1)//还原房间编号
{
roomID="0"+row.ToString()+"0"+col.ToString();
}
else
{
roomID="0"+row.ToString()+col.ToString();
}
DataRow[] aRows=this.statusTable.Select("客房编号='"+roomID+"'");
if(aRows.Length==0)//如果未选中房间,则不进行任何处理
{
txt1.Clear();//清除房号
cmb1.Text="";//清除类型
return;
}
DataRow rRow=aRows[0];//读入当前房号数据
txt1.Text=rRow["客房编号"].ToString().Trim();
cmb1.Text=this.ShowRoomType(txt1.Text);
string status;//选中房间房态
status=rRow["状态"].ToString().Trim();
switch(status)
{
case "空房":
rb1.Checked=true;
break;
case "住房":
rb2.Checked=true;
break;
case "自用":
rb3.Checked=true;
break;
case "维修":
rb4.Checked=true;
break;
case "将到":
rb5.Checked=true;
break;
case "将离":
rb6.Checked=true;
break;
}
txt1.Focus();
}
//-------根据输入的房间号,读入房间类型------
private string ShowRoomType(string num)
{
string strConn="workstation id=localhost;Integrated Security=SSPI;Database=hotelbook;";
SqlConnection cn=new SqlConnection(strConn);
cn.Open();
SqlCommand cmd=cn.CreateCommand();
cmd.CommandText="select b.类型名称 from 客房信息 a,客房类型 b"
+" where(a.类型编号=b.类型编号)and(a.客房编号='"+num+"')";
string rType=cmd.ExecuteScalar().ToString().Trim();
return(rType);
}
//-------------根据选择的房间类型显示房间-------------
private void cmb1_SelectionChangeCommitted(object sender, System.EventArgs e)
{
string sql;
int i=cmb1.SelectedIndex;
string roomType=cmb1.Items[i].ToString().Trim();
if(roomType=="全部")
{
sql="select * from 客房信息";
}
else
{
sql="select a.* from 客房信息 a,客房类型 b where (a.类型编号=b.类型编号)"
+"and(b.类型名称='"+roomType+"')";
}
RefreshStatus(sql);//读入所选类型房间的数据
dataGrid1.Refresh();
}
//--------刷新房态-----------
private void btnRefresh_Click(object sender, System.EventArgs e)
{
string sqlStr;
if(cmb1.Text=="")
{
sqlStr="select * from 客房信息";
}
else
{
sqlStr="select a.* from 客房信息 a,客房类型 b where (a.类型编号=b.类型编号)"
+"and(b.类型名称='"+cmb1.Text+"')";
}
RefreshStatus(sqlStr);//更新房间的数据
dataGrid1.Refresh();
}
//----------更改房间状态---------
private void btnModify_Click(object sender, System.EventArgs e)
{
if(txt1.Text=="")
{
MessageBox.Show("请先选择要更改状态的房间!");
return;
}
DialogResult dlg;
string msg="一般情况下不能直接在房态图中修改房间状态,确定要修改吗?";
dlg=MessageBox.Show(msg,"确认修改",MessageBoxButtons.OKCancel,MessageBoxIcon.Warning);
if(dlg==DialogResult.OK)
{
string strConn="workstation id=localhost;Integrated Security=SSPI;Database=hotelbook;";
SqlConnection cn=new SqlConnection(strConn);
cn.Open();
SqlCommand cmd=cn.CreateCommand();
string newStatus="";
if(rb1.Checked)
newStatus="空房";
if(rb2.Checked)
newStatus="住房";
if(rb3.Checked)
newStatus="自用";
if(rb4.Checked)
newStatus="维修";
if(rb5.Checked)
newStatus="将到";
if(rb6.Checked)
newStatus="将离";
//更改房间状态
cmd.CommandText="update 客房信息 set 状态='"+newStatus+"' where 客房编号='"+txt1.Text+"'";
cmd.ExecuteNonQuery();
RefreshStatus("select * from 客房信息");//显示全部房间
dataGrid1.Refresh();
}
}
//--------双击向预定或入住窗体中返回客房数据--------
private void txt1_DoubleClick(object sender, System.EventArgs e)
{
if(this.formType==0||txt1.Text=="")//如果类型为房态图正常显示或未选中房间,则不必返回数据
{
return;
}
if(!rb1.Checked)
{
MessageBox.Show("必须选择空房");
return;
}
string[] returnInfo={"",""};
if(this.formType==1)//向客房预定管理窗体中返回信息
{
returnInfo[0]=txt1.Text;
returnInfo[1]=cmb1.Text;
HotelReserve.roomInfo=returnInfo;
this.Close();
}
if(this.formType==2)//向客房入住管理窗体中返回信息
{
returnInfo[0]=txt1.Text;
returnInfo[1]=cmb1.Text;
HotelArrival.roomInfo=returnInfo;
this.Close();
}
}
//----------每当窗体激活时,即刷新房态-------------
private void RoomStatus_Activated(object sender, System.EventArgs e)
{
string sqlStr;
if(cmb1.Text=="")
{
sqlStr="select * from 客房信息";
}
else
{
sqlStr="select a.* from 客房信息 a,客房类型 b where (a.类型编号=b.类型编号)"
+"and(b.类型名称='"+cmb1.Text+"')";
}
RefreshStatus(sqlStr);//更新房间的数据
dataGrid1.Refresh();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -