服务端管理工具编写(三)——各控件的安排及事件

C#是面向对象的,所以重点是各控件的事件,控件有很多事件,不同的控件还有不同的事件,只要挑选好控件的事件进行代码编写,就可以满足需求。

有些代码可以在不同的控件事件中编写都可以满足要求的,如“会议管理”选项卡中的“会议地点”后面的combox初始化,可以在窗体加载事件中进行初始化,也可以在“会议管理”选项卡加载事件中进行初始化,甚至可以在自己获取焦点的时候进行初始化,都可以达到让它初始化列出所有会议室的目的,因此,以下博文除非有特别需要,否则不针对某个控件进行事件讲述,只讲如何实现目标。

由于很多代码会用到上篇博文讲到的公共函数,因此项目需要引用这个dll文件,由于这个dll文件本身就是在同一个解决方案里面的,所以引用就很简单了。在MeetingManage项目中的引用中鼠标右键单击,在菜单中选中添加引用,在弹窗中有个“项目”选项卡,里面只有一个,就是“MeetingData”,选中确定就搞定了。

一、给dataGridView加载数据,列出符合条件的会议。

这个功能会用得比较多,窗体初始化要用,刷新按钮要用,添加完新会议也要用,所以单独编写一个函数,需要用的时候直接调用就是了。要注意的是控件名,我用的是系统默认的名称,涉及到控件名的时候我会注释出来的。

public void MeetingRefresh()
        {
            //由于是调试阶段,下面的SQL语句不加限制条件,把所以会议都从数据库中选出来。
            DataTable DT = MeetingData.MdbData.GetDataTable("Select ID,mName,mTimeStar,mTimeOver,mRoom from Meeting");
            if (DT.Rows.Count > 0)
            {
                //dataGridView如果直接绑定DataTable会在顶行显示字段名,那一堆英文名不好理解,所以重新弄一个DataTable
                DataTable dMeeting = new DataTable();
                dMeeting.Columns.Add("编号", typeof(string));
                dMeeting.Columns.Add("会议名称", typeof(string));
                dMeeting.Columns.Add("开始时间", typeof(string));
                dMeeting.Columns.Add("结束时间", typeof(string));
                dMeeting.Columns.Add("会议室", typeof(string));
                for (int i = 0; i < DT.Rows.Count; i++)
                {
                    DataRow NewRow;
                    NewRow = dMeeting.NewRow();
                    NewRow["编号"] = DT.Rows[i]["ID"].ToString().Trim();
                    NewRow["会议名称"] = DT.Rows[i]["mName"].ToString().Trim();
                    NewRow["开始时间"] = DT.Rows[i]["mTimeStar"].ToString().Trim();
                    NewRow["结束时间"] = DT.Rows[i]["mTimeOver"].ToString().Trim();
                    NewRow["会议室"] = MeetingData.MdbData.GetAny("MeetingRoom", "mName", "ID", DT.Rows[i]["mRoom"].ToString().Trim()).Trim();
                    dMeeting.Rows.Add(NewRow);
                }
                //<span style="font-family: Arial, Helvetica, sans-serif;">dataGridView1就是控件,用于显示所有会议,具体用法可以百度之,下面一句代码就是把数据绑定。</span>
                dataGridView1.DataSource = dMeeting;
                //设置dataGridView1列宽度
                dataGridView1.RowHeadersWidth = 30;
                dataGridView1.Columns[0].Width = 40;
                dataGridView1.Columns[1].Width = 342;
                dataGridView1.Columns[2].Width = 115;
                dataGridView1.Columns[3].Width = 115;
                dataGridView1.Columns[4].Width = 140;
                //设置dataGridView1的标题栏和内容栏文字对齐方式,第一句是标题栏文字居中,第二句是内容栏文字左对齐
                dataGridView1.AlternatingRowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
                dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                //能进入这里表示数据库中有符合条件的会议,所以把label5藏起来,label5是提示没有会议的静态显示label。
                label5.Hide();
            }
            else
            {
                //如果数据库中没有数据,则隐藏无关的控件,dataGridView1是显示会议数据用的,label9是提示选择会议的那行文字,comboBox2是列出操作选项的,button4是那个确定按钮。
                dataGridView1.Hide();
                label9.Hide();
                comboBox2.Hide();
                button4.Hide();
            }
        }
这个就是读取数据库会议数据并绑定在dataGridView1控件中的代码,由于是一个单独的函数,可以在根据需要放在form1的Load时间中,也可以放在选项卡的加载事件中,随便啦。例如单击刷新按钮事件就可以直接调用这个函数了,项目中刷新按钮的的名称为button3,只需要如下代码

        private void button3_Click(object sender, EventArgs e)//刷新会议
        {
            MeetingRefresh();
        }

dataGridView这个控件本身是可以编辑数据并进行数据库同步的,但我只需要显示功能,因为编辑功能有点复杂,单位使用这管理工具的人水平还没那么高,所以有些属性要先设好,AllowUserToAddRows设为False;AllowUserToDeleteRows设置为False;这个两个属性是不可添加记录,不可删除记录。
接下来讲一下系统中会议操作选项的添加以及确定按钮事件响应

操作选项是我刚开始的时候弄进来,就是为了操作列出的会议,但后来我添加了右键菜单,懒得删除相应的控件和代码,不过给小家伙们学习学习也不错的。列出操作选项的控件名叫comboBox2,一看就知道是个comboBox啦。

DataTable OP = new DataTable();
OP.Columns.Add("Display", typeof(string));
OP.Columns.Add("sValue", typeof(string));
DataRow OPRow;
OPRow = OP.NewRow();
OPRow["Display"] = "请选择一项操作";
OPRow["sValue"] = "0";
OP.Rows.Add(OPRow);
OPRow = OP.NewRow();
OPRow["Display"] = "修改基本信息";
OPRow["sValue"] = "1";
OP.Rows.Add(OPRow);
OPRow = OP.NewRow();
OPRow["Display"] = "编辑会议议程";
OPRow["sValue"] = "2";
OP.Rows.Add(OPRow);
OPRow = OP.NewRow();
OPRow["Display"] = "上传会议文件";
OPRow["sValue"] = "7";
OP.Rows.Add(OPRow);
OPRow = OP.NewRow();
OPRow["Display"] = "选择会议主持人";
OPRow["sValue"] = "3";
OP.Rows.Add(OPRow);
OPRow = OP.NewRow();
OPRow["Display"] = "选择与会人员";
OPRow["sValue"] = "4";
OP.Rows.Add(OPRow);
OPRow = OP.NewRow();
OPRow["Display"] = "启动会议";
OPRow["sValue"] = "5";
OP.Rows.Add(OPRow);
OPRow = OP.NewRow();
OPRow["Display"] = "清理过期会议";
OPRow["sValue"] = "6";
OP.Rows.Add(OPRow);
comboBox2.DataSource = OP;
comboBox2.DisplayMember = "Display";
comboBox2.ValueMember = "sValue";
原理很简单,先定义一个DataTable,只有两字段Display和sValue,一个用于显示,一个是真正的值,由于其他程序进行判断,最后绑定comboBox2数据源为这个表,并把comboBox2的DisplayMember设为Display,把ValueMember设为sValue。这段代码根据需要可以单列做一个函数,也可以放在窗体或选项卡加载事件中,反正放在使用它之前完成就可以了,添加选项按照代码中格式照加就是了,添加一个选项就4句代码而已。
与comboBox2关联应用的是一个按钮,名字叫button4,这个按钮就是查看comboBox2选中了那个选项,根据这个进行相应处理。其实这个button完全是多余的,纯粹是多一步操作,为了配合习惯而设置的。button4单击事件完全可以在comboBox2的SelectionChangeCommitted事件中完成的,不过也给出代码,差不多的,供参考。

        private void button4_Click(object sender, EventArgs e)//会议操作
        {
            string iOP = comboBox2.SelectedValue.ToString();
            if (iOP =="0")
            {
                MessageBox.Show("请选择一个操作项目","错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
                return;
            }
            string sMeetingID = dataGridView1.CurrentRow.Cells[0].Value.ToString();
            switch (iOP)
            { 
                case "1":
                    //处理代码
                    break;
                case "2":
                    //处理代码
                    break;
                default:
                    break;
            }
        }
“会议管理”选项卡中显示会议主要代码就是这些,下面讲讲添加新会议,按图拉那一堆控件摆好就不多说了,先讲讲列出会议室的代码。

列出会议室控件也是个comboBox1,看后面的数字就知道了吧,我写程序时候由于数据库没有数据,是先写添加会议功能的,哈哈。

DataTable DT= MeetingData.MdbData.GetDataTable("Select * from MeetingRoom");
            if (DT.Rows.Count > 0)
            {
                comboBox1.DataSource = DT;
                comboBox1.DisplayMember = "mName";
                comboBox1.ValueMember = "ID";
            }
            else
                MessageBox.Show("请先添加会议室!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
这段代码就不用多说了吧,读取所有会议室到一个DataTable中,并绑定到comboBox1,设置DisplayMember和ValueMember为相应的字段。
好,现在开始添加新会议,前提是数据库中已经有会议室,可以自己使用Access从数据库里面自己弄进去,如果系统只有一个会议室,可以删除相应的代码。添加新会议其实就是button2的Click事件。
private void button2_Click(object sender, EventArgs e)//添加新会议
        {
//textBox1是标题输入框,定义个string变量读取它的文本,并清除前后空格
            string sTitle = textBox1.Text.Trim();
//dataTimePicker1和dataTimePicker2都是时间日期控件,定义两个DataTime变量读取它们的值
            DateTime dStar = dateTimePicker1.Value;
            DateTime dEnd= dateTimePicker2.Value;
//comboBox1是列表控件,列出所有会议室
            string sRoom = comboBox1.SelectedValue.ToString();
//开始进行数据校验
//检查标题清除前后空格后是否为空
            if (sTitle == "")
            {
                MessageBox.Show("会议标题不能为空!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
//检查会议开始时间是否小于结束时间
            if (dStar >= dEnd)
            {
                MessageBox.Show("会议开始时间大于或等于结束时间!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
//检查会议室是否有选中,其实这段是多余的,除非其它代码在这个控件中添加了不存在的选项,否则总会选中一个会议室的。
            if (Convert.ToInt32(sRoom) < 1)
            {
                MessageBox.Show("请选择开会的会议室!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
//要生成插入的SQL语句,定义了两个字符串数组,注意sValue,要根据值的不同在前后添加上单引号的。
            string[] sField={"mName","mTimeStar","mTimeOver","mRoom"};
            string[] sValue = { "'" + sTitle + "'", "'" + dStar.ToString() + "'", "'" + dEnd.ToString() + "'", sRoom };
//生成插入数据的SQL指令
            string sCmd = MeetingData.MdbData.SQLInsert("Meeting", sField, sValue);
//执行指令
            MeetingData.MdbData.SQLCom(sCmd);
            MessageBox.Show("会议添加成功,请进行后续设置","提示",MessageBoxButtons.OK, MessageBoxIcon.Information);
//刷新dataGridView1的数据
            MeetingRefresh();
        }
添加新会议就那么简单,代码我都做了注释了,在讲讲添加会议室,总不可能老是用Access来添加吧,虽然都是添加一次就算数,修改的可能性等于零,没有这功能也无所谓,但从后面扩展需要添加会议室座椅安排等考虑,我还是设置了这个选项卡,但项目紧张,先弄个添加会议室功能顶着用先。

使用dataGridView列出所有会议室,控件名称为dataGridView2

            DataTable DT = MeetingData.MdbData.GetDataTable("Select ID,mName from MeetingRoom");
            if (DT.Rows.Count > 0)
            {
                DataTable dRoom = new DataTable();
                dRoom.Columns.Add("编号", typeof(string));
                dRoom.Columns.Add("会议室名称", typeof(string));
                dRoom.Columns.Add("状态", typeof(string));
                for (int i = 0; i < DT.Rows.Count; i++)
                {
                    DataRow NewRow;
                    NewRow = dRoom.NewRow();
                    NewRow["编号"] = DT.Rows[i]["ID"].ToString().Trim();
                    NewRow["会议室名称"] = DT.Rows[i]["mName"].ToString().Trim();
                    NewRow["状态"] = "空闲";
                    dRoom.Rows.Add(NewRow);
                }
                dataGridView2.DataSource = dRoom;
                dataGridView2.RowHeadersWidth = 30;
                dataGridView2.Columns[0].Width = 40;
                dataGridView2.Columns[1].Width = 190;
                dataGridView2.Columns[2].Width = 155;
                dataGridView2.AlternatingRowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
                dataGridView2.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                label7.Hide();
            }
            else
                dataGridView2.Hide();
和列出所有会议是一个鸟样的,注意有个状态这个列,值都是空闲的,这个是想着判断当前日期时间是否有会议的,后来觉得没什么用,就这样挂着了,可以删除掉的。
label7是提示没有会议室的提示静态显示label
添加新会议室,其实就是button1的Click事件,这部分代码和添加新会议差不多的,都是读取文本框值清前后空格,进行规则检查,没问题就写入数据库。

        private void button1_Click(object sender, EventArgs e)//添加会议室
        {
            if (textBox2.Text.Trim() == "")
            {
                MessageBox.Show("请输入会议室名称","错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
                return;
            }
            string sRoomName = textBox2.Text.Trim();
            MeetingData.MdbData.SQLCom(@"Insert Into MeetingRoom (mName) Values ('" + sRoomName + "')");
            MeetingRoomRefresh();
        }
注意写入数据的SQL语句,由于实在太简单,都懒得用生成函数了,直接写SQL命令了。MeetingRoomRefresh()是刷新dataGridView2的数据的函数,代码就是上面提供的,我写成了一个函数而已,方便调用,和列出所有会议那个函数其实是同一回事,就绑定的数据源不一样而已。

到现在,小家伙名应该明白C#的基本用法了,就是选择合适的控件,通过绑定不同数据显示不同的内容,通过不同的事件对数据进行校验处理并写入数据库。编程没有想象中那么复杂和高大上,老鸟和菜鸟只是在控件使用熟练程度不同而已,高手也就是在算法方面比较牛,但对这些小应用来讲,在一个计算机运算能力多余的情况下,不需要考虑运算效率,以最短的时间完成项目才是正道。

下篇博文讲如何添加右键菜单,对会议进行处理。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值