来访人员登记系统(九)系统总体结构
列表刷新事件的触发
系统一共包含两个窗体,一个是登录界面,一个是主界面。主界面是由一个tabControl和五个选项卡组成的,每个选项卡都有各自的功能,其中四个选项卡共享同一个数据源,我在代码中写的事件是切换选项卡会导致所有选项卡刷新:
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
button_add_reset_Click(sender, e);
button_delete_reset_Click(sender, e);
button_alter_reset_Click(sender, e);
button_sign_reset_Click(sender, e);
button_log_reset_Click(sender, e);
}
这样写的目的是想实时地将数据库中的数据传递到窗体程序中,因为存在远程插入数据的操作,且不同选项卡都可以修改同一个数据源的数据,所以这一步是很有必要的。
此外我还在添加记录的页面加入了刷新列表的功能,因为服务端为了接收远程数据,是需要长期就绪的,但在远程数据进来的时候并不能通过触发事件的方式来刷新datagridview,原因是我没有把刷新datagridview的操作封装成一个函数,而是直接写在点击重置按钮的事件里了。
如果想要改进,理论上可以将刷新数据源的操作封装成一个函数,然后在Fleck的OnMessage方法中调用此函数即可,重置事件触发时也可以直接调用函数。
由此可以说明,事件中一般不写具体操作,而是采用将具体操作封装成函数,再由事件调用的形式来写,这样逻辑会比较清楚,且能够避免大量的代码冗余。
窗体加载和退出时的处理
在窗体加载的事件中,创建了全局共享的数据库连接DBconn,可以由各个事件共享使用,另外还开启了websocket的监听:
private void Form_Main_Load(object sender, EventArgs e)
{
// 服务器选用本地sql服务,需要给足sql用户权限,数据库名称administrator
String connStr = "server=localhost;user=root;password=1010;database=administrator";
DBconn = new MySqlConnection(connStr);
try
{
DBconn.Open();
tabControl1_SelectedIndexChanged(sender, e);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
// 开启服务器
StartServer();
}
在窗体即将关闭和关闭的时候,将数据库关闭,应用的进程结束掉:
private void Form_Main_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("确定退出?", "提示", MessageBoxButtons.OKCancel) == DialogResult.Cancel) {
e.Cancel = true;
}
}
private void Form_Main_FormClosed(object sender, FormClosedEventArgs e)
{
DBconn.Close();
System.Windows.Forms.Application.Exit();
}
列表的刷新和表单的重置
在每一个窗口都有一个重置按钮,预约登记窗口中还有刷新按钮,主要就是用来将页面初始化,清空文本框中的内容,并刷新datagridview,将其列间距设置为Fill,并手动调整各个列的比例,设置各个列的内容居中显示。重置按钮以预约登记为例,代码如下:
private void button_add_reset_Click(object sender, EventArgs e)
{
textBox_add_name.ForeColor = Color.DarkGray;
textBox_add_name.Text = "姓名";
textBox_add_company.ForeColor = Color.DarkGray;
textBox_add_company.Text = "单位";
textBox_add_phone.ForeColor = Color.DarkGray;
textBox_add_phone.Text = "电话";
textBox_add_idcard.ForeColor = Color.DarkGray;
textBox_add_idcard.Text = "身份证号";
textBox_add_staff.ForeColor = Color.DarkGray;
textBox_add_staff.Text = "陪同人员";
textBox_add_ETA.ForeColor = Color.DarkGray;
textBox_add_ETA.Text = "预约时间";
dateTimePicker_add.Value = DateTime.Now;
textBox_add_relevants.ForeColor = Color.DarkGray;
textBox_add_relevants.Text = "涉及设备/系统";
textBox_add_intention.ForeColor = Color.DarkGray;
textBox_add_intention.Text = "来访目的";
string cmd = "select number as '序号', name as '姓名', company as '单位', idcard as '身份证号', phone as '电话', " +
"staff as '陪同人员', ETA as '预约时间', date as '预约日期', relevants as '涉及设备/系统', " +
"intention as '来访目的' from registration;";
MySqlDataAdapter adapter = new MySqlDataAdapter(cmd, DBconn);
System.Data.DataTable dt = new System.Data.DataTable();
adapter.Fill(dt);
dataGridView1.DataSource = dt;
dataGridView1.Columns[0].FillWeight = 25; // 序号
dataGridView1.Columns[1].FillWeight = 25; // 姓名
dataGridView1.Columns[2].FillWeight = 30; // 单位
dataGridView1.Columns[3].FillWeight = 65; // 身份证号
dataGridView1.Columns[4].FillWeight = 40; // 电话
dataGridView1.Columns[5].FillWeight = 35; // 陪同人员
dataGridView1.Columns[6].FillWeight = 35; // 预约时间
dataGridView1.Columns[7].FillWeight = 40; // 预约日期
dataGridView1.Columns[8].FillWeight = 50; // 涉及设备/系统
dataGridView1.Columns[9].FillWeight = 45; // 来访目的
// 居中
dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
foreach (DataGridViewColumn item in this.dataGridView1.Columns)
{
item.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
item.SortMode = DataGridViewColumnSortMode.NotSortable;
}
}
刷新列表的代码其实就是重置按钮事件中的从数据库取数据那一块,就不再赘述了。
总结
系统的功能总体上来说基本符合需求,但出现了大量的代码冗余,以至于修改起来非常麻烦;
html的websocket用来做客户端服务端通信非常方便,且提供了各种情况下的事件处理。

浙公网安备 33010602011771号