服务端管理工具编写(三)——各控件的安排及事件
来源:互联网 发布:淘宝九块九包邮在哪 编辑:程序博客网 时间:2024/06/06 18:30
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#的基本用法了,就是选择合适的控件,通过绑定不同数据显示不同的内容,通过不同的事件对数据进行校验处理并写入数据库。编程没有想象中那么复杂和高大上,老鸟和菜鸟只是在控件使用熟练程度不同而已,高手也就是在算法方面比较牛,但对这些小应用来讲,在一个计算机运算能力多余的情况下,不需要考虑运算效率,以最短的时间完成项目才是正道。
下篇博文讲如何添加右键菜单,对会议进行处理。
- 服务端管理工具编写(三)——各控件的安排及事件
- 服务端管理工具编写(一)——UI控件
- 服务端管理工具编写(二)——公共函数及配置文件读写
- 服务端管理工具编写(四)——鼠标右键菜单及会议管理
- 服务端管理工具编写(五)——添加议程和上传会议文件
- 服务端控件开发 包含处理机制—— 子控件中调用住空间委托的事件实例
- 编写Qt Designer自定义控件(三)——给自定义控件添加属性
- 编写Qt Designer自定义控件(三)——给自定义控件添加属性
- EZ-USB开发笔记(三)——内存安排
- 关于控件的事件函数编写
- WebService——使用C#编写WebService的服务端
- html控件触发服务端事件
- Asp.net 中服务端控件事件是如何触发的
- Asp.net中服务端控件事件是如何触发的
- Asp.net 中服务端控件事件是如何触发的
- Asp.net中服务端控件事件是如何触发的
- Asp.net中服务端控件事件是如何触发的
- Asp.net 中服务端控件事件是如何触发的
- POJ刷题(2406)
- 设计模式---观察者模式
- 一个textview显示不同zize大小的文本
- SQL必知必会 笔记 第五章 高级过滤数据
- 11.3 TCP内核同步
- 服务端管理工具编写(三)——各控件的安排及事件
- 数组变量名能否++(int a [10];a++;)
- Ubuntu部署Apache-PartI
- error C2054:在“inline”之后应输入“(
- vs控制台一闪而过解决办法
- asp.net MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
- 通过设置mmc IP安全策略禁止ping入本机 - sever 2008 Apache优化配置
- 第六周项目3 人数不定的工资类
- C#面试知识点