本节将设计F_Find窗体,这个窗体将实现职工的信息,按照多种条件进行查询,例如职工的年龄、性别等等条件,查询单个人的信息,或者是符合条件的群体的信息等,实现过程较为简单,大概为SQL和C#语言的混合使用,同时,还需要了解基于C#的windows编程的基础,如如何设计界面等,添加事件等。本节设计的窗体比较简便,窗体如下:
窗体主要用到GridView,GroupBox,ComBox,以及CheckBox、radioButton、Button等控件,ComBox主要是提供可选的内容,通过其下拉列表来进行体现,利用GridView控件来显示查询结果。
按照界面设计好后,开始实现窗体的功能,添加功能代码:
1.首先,在C#中,有这么一句话“万物皆对象”,所以首先声明这个窗体所使用的对象,并进行实例化:
ModuleClass.MyModule MyMC = new ModuleClass.MyModule(); DataClass.MyMeans MyDataClass = new DataClass.MyMeans(); public static DataSet MyDS_Grid; //逻辑操作符标志 AND 和 OR ,初始化为 AND public string ARsign = " AND "; //设置查询条件 public static string Sut_SQL = "select ID as 编号,StuffName as 职工姓名,Folk as 民族类别,Birthday as 出生日期,Age as 年龄,Kultur as 文化程度,Marriage as 婚姻,Sex as 性别,Visage as 政治面貌,IDCard as 身份证号,Workdate as 单位工作时间,WorkLength as 工龄,Employee as 职工类别,Business as 职务类别,Laborage as 工资类别,Branch as 部门类别,Duthcall as 职称类别,Phone as 电话,Handset as 手机,School as 毕业学校,Speciality as 主修专业,GraduateDate as 毕业时间,M_Pay as 月工资,Bank as 银行帐号,Pact_B as 合同开始时间,Pact_E as 合同结束时间,Pact_Y as 合同年限,BeAware as 籍贯所在省,City as 籍贯所在市 from tb_Stuffbusic";2.同样的当生成这个窗体,未进行操作之前窗体还需要完成一些操作,例如这个窗体的加载事件,需要将所需要表进行加载:
private void F_Find_Load(object sender, EventArgs e) { MyMC.CoPassData(Find_Folk, "tb_Folk"); MyMC.CoPassData(Find_Kultur, "tb_Kultur"); MyMC.CoPassData(Find_Visage, "tb_Visage"); //向"正治面貌”列表框中添加信息 MyMC.CoPassData(Find_Employee, "tb_EmployeeGenre"); //向"职工类别”列表框中添加信息 MyMC.CoPassData(Find_Business, "tb_Business"); //向"职务类别”列表框中添加信息 MyMC.CoPassData(Find_Laborage, "tb_Laborage"); //向"工资类别”列表框中添加信息 MyMC.CoPassData(Find_Branch, "tb_Branch"); //向"部门类别”列表框中添加信息 MyMC.CoPassData(Find_Duthcall, "tb_Duthcall"); //向"职称类别”列表框中添加信息 //向下拉列表中添加省名 MyMC.CityInfo(Find_BeAware, "select distinct beaware from tb_City", 0); //向下拉列表中添加市名 MyMC.CityInfo(Find_School, "select distinct School from tb_Stuffbusic", 0); //向下拉列表中添加主修专业 MyMC.CityInfo(Find_Speciality, "select distinct Speciality from tb_Stuffbusic", 0); MyMC.MaskTextBox_Format(Find1_WorkDate); //指定MaskedTextBox控件的格式 MyMC.MaskTextBox_Format(Find2_WorkDate); //得到查询的结果存放在MyDS_Grid中(从tb_Stuffbusic表中获得) MyDS_Grid = MyDataClass.GetDataSet (Sut_SQL, "tb_Stuffbusic"); dataGridView1.DataSource = MyDS_Grid.Tables[0]; dataGridView1.AutoGenerateColumns = true; }其中CoPassData、CityInfo、MaskTextBox_Format方法都在MyModule类中进行了实现,功能描述如注释所示,详细的实现过程参照后续补充的MyModule类。
当我们点选时,如果修改了籍贯,则相应的城市也应该需要改变,所以我们通过籍贯的TextChanged事件来实现这一过程,设计如下:
private void Find_BeAware_TextChanged(object sender, EventArgs e) { Find_City.Items.Clear(); MyMC.CityInfo(Find_City, "select beaware,city from tb_City where beaware='" + Find_BeAware.Text.Trim() + "'", 1); }3.当我们选择通过与运算或者是或运算时,若设计一个radioButton按钮则逻辑较为复杂,通过将连个按钮放到同一个GroupBox按钮之中实现切换,同时也能降低操作难度,所以,通过CheckChanged事件就可以较好的解决这个问题:
private void radioButton1_CheckedChanged(object sender, EventArgs e) { ARsign = " AND "; } private void radioButton2_CheckedChanged(object sender, EventArgs e) { ARsign = " OR "; }通过,这个设置能够实现对SQL查询语句改动,从而实现了对查询逻辑的改变。注: and 和 or 前后都有空格,遵守SQL的语言规则。
4.接下来是对世间的处理,比如工作世间一栏,需要将日期机型一下处理:
首先对于第一个输入的控制,时期只能输入数字型字符串,通过Estimate_Key方法实现对键盘输入的控制,控件的KeyPress事件的响应程序如下:
private void Find1_WorkDate_KeyPress(object sender, KeyPressEventArgs e) { MyMC.Estimate_Key(e, "", 0); }当输入框不再处于活动时,进行输入的检查,检查其是否符合指定的格式,通过Estimate_Date方法进行判断;故,设计其Leave事件,当不再为活动时,触发此事件:
private void Find1_WorkDate_Leave(object sender, EventArgs e) { MyMC.Estimate_Date((MaskedTextBox)sender); }以上提到的两个方法同样在MyModule类中进行了详细的实现,实现过程参照MyModule类,对于右边的工作时间的填写也需要进行类似于以上的判断,首先,控制输入的内容为数字型字符:
private void Find2_WorkDate_KeyPress(object sender, KeyPressEventArgs e) { MyMC.Estimate_Key(e, "", 0); }同时以需要对输入的内容进行判断:
private void Find2_WorkDate_Leave(object sender, EventArgs e) { bool TDate = MyMC.Estimate_Date((MaskedTextBox)sender); if(TDate==true) if(TDate==true) if (MyMC.Date_Format(Find1_WorkDate.Text) != "" && MyMC.Date_Format(Find2_WorkDate.Text) != "") { if(Convert.ToDateTime(Find2_WorkDate.Text)<=Convert.ToDateTime(Find1_WorkDate.Text)) MessageBox.Show("当前日期必须大于它前一个日期。"); } }对于只能输入数字型字符的还有,年龄,月工资,工龄,合同年限也需要在输入时使用Estimate_Key方法进行限定。
private void Find_Age_KeyPress(object sender, KeyPressEventArgs e) { MyMC.Estimate_Key(e, "", 0); } private void Find_M_Pay_KeyPress(object sender, KeyPressEventArgs e) { MyMC.Estimate_Key(e, ((TextBox)sender).Text, 1); } private void Find_WorkLength_KeyPress(object sender, KeyPressEventArgs e) { MyMC.Estimate_Key(e, "", 0); } private void Find_Pact_Y_KeyPress(object sender, KeyPressEventArgs e) { MyMC.Estimate_Key(e, "", 0); }5.当勾选全部时,GridView中需要显示全部的内容,其Click时间如下:
private void checkBox1_Click(object sender, EventArgs e) { MyDS_Grid = MyDataClass.GetDataSet(Sut_SQL, "tb_Stuffbusic"); dataGridView1.DataSource = MyDS_Grid.Tables[0]; dataGridView1.AutoGenerateColumns = true; }6.当点击查询时,我们的查询开始进行,其实现过程如下:
private void button1_Click(object sender, EventArgs e) { ModuleClass.MyModule.FindValue = ""; string Find_SQL = Sut_SQL; MyMC.Find_Grids(groupBox1.Controls, "Find",ARsign); MyMC.Find_Grids(groupBox2.Controls, "Find", ARsign); //当合同的起始日期和技术日期不为空 if (MyMC.Date_Format(Find1_WorkDate.Text) != "" && MyMC.Date_Format(Find2_WorkDate.Text) != "") { if (ModuleClass.MyModule.FindValue != "") //用ARsign变量连接查询 ModuleClass.MyModule.FindValue = ModuleClass.MyModule.FindValue + " (" + "workdate>='" + Find1_WorkDate.Text + "' AND workdate<='" + Find2_WorkDate.Text + "')"; } if (ModuleClass.MyModule.FindValue != "") //如果FindValue字段不为空 //将查询条件添加到SQL语句的尾部 Find_SQL = Find_SQL + " where " + ModuleClass.MyModule.FindValue; //按照指定的条件进行查询 MyDS_Grid = MyDataClass.GetDataSet (Find_SQL, "tb_Stuffbusic"); //在dataGridView1控件是显示查询的结果 dataGridView1.DataSource = MyDS_Grid.Tables[0]; dataGridView1.AutoGenerateColumns = true; checkBox1.Checked = false; }当点击清除时,需要清除控件的所有内容,其Click事件实现如下:
private void button2_Click(object sender, EventArgs e) { Clear_Box(7, groupBox1.Controls, "Find"); Clear_Box(12, groupBox2.Controls, "Find"); Clear_Box(4, groupBox2.Controls, "Sign"); }
其中,Clear_Box方法设计如下:
private void Clear_Box(int n, Control.ControlCollection GBox, string TName) { for (int i = 0; i < n; i++) { foreach (Control C in GBox) { if(C.GetType().Name== "TextBox" | C.GetType().Name == "MaskedTextBox" | C.GetType().Name == "ComboBox") if (C.Name.IndexOf(TName) > -1) { C.Text = ""; } } } }