CurriculumSchedule.cs
上传用户:hjieqiu
上传日期:2013-05-11
资源大小:16494k
文件大小:12k
源码类别:

企业管理

开发平台:

C#

  1. using System;
  2. using System.Drawing;
  3. using System.Collections;
  4. using System.ComponentModel;
  5. using System.Windows.Forms;
  6. using System.Data;
  7. using System.Data.SqlClient;
  8. using System.Reflection;
  9. namespace 教务管理系统
  10. {
  11. /// <summary>
  12. /// CurriculumSchedule 的摘要说明。
  13. /// </summary>
  14. public class CurriculumSchedule : System.Windows.Forms.Form
  15. {
  16. /// <summary>
  17. /// 必需的设计器变量。
  18. /// </summary>
  19. private DataTable scheduleTable;//课表
  20. private DataTable curriculumTable;//保存学生的课程信息
  21. private System.Windows.Forms.DataGrid dataGrid1;
  22. private System.Windows.Forms.GroupBox groupBox1;
  23. private System.Windows.Forms.TextBox txt1;
  24. private System.Windows.Forms.Label label1;
  25. private System.Windows.Forms.TextBox txt2;
  26. private System.Windows.Forms.Label label2;
  27. private System.Windows.Forms.TextBox txt3;
  28. private System.Windows.Forms.Label label4;
  29. private System.ComponentModel.Container components = null;
  30. //重写构造函数,以判断是从选课窗体中调用课表还是直接显示课表
  31. public CurriculumSchedule(string viewID)
  32. {
  33. //
  34. // Windows 窗体设计器支持所必需的
  35. //
  36. InitializeComponent();
  37. //
  38. // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
  39. //
  40. if(viewID!="")
  41. {
  42. this.curriculumTable=new DataTable();
  43. this.DataGridStateControl();
  44. this.LoadStduentInfo(viewID);//读入学生信息和选课信息
  45. this.LoadCurriculumInfo(viewID);
  46. this.curriculmToSchedule();
  47. this.AutoSizeGrid();
  48. txt1.Text=viewID;//显示学号
  49. groupBox1.Enabled=false;//不允许改变显示的信息
  50. }
  51. else
  52. {
  53. this.curriculumTable=new DataTable();
  54. this.DataGridStateControl();
  55. this.AutoSizeGrid();
  56. }
  57. }
  58. /// <summary>
  59. /// 清理所有正在使用的资源。
  60. /// </summary>
  61. protected override void Dispose( bool disposing )
  62. {
  63. if( disposing )
  64. {
  65. if(components != null)
  66. {
  67. components.Dispose();
  68. }
  69. }
  70. base.Dispose( disposing );
  71. }
  72. #region Windows 窗体设计器生成的代码
  73. /// <summary>
  74. /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  75. /// 此方法的内容。
  76. /// </summary>
  77. private void InitializeComponent()
  78. {
  79. this.dataGrid1 = new System.Windows.Forms.DataGrid();
  80. this.groupBox1 = new System.Windows.Forms.GroupBox();
  81. this.txt1 = new System.Windows.Forms.TextBox();
  82. this.label1 = new System.Windows.Forms.Label();
  83. this.txt2 = new System.Windows.Forms.TextBox();
  84. this.label2 = new System.Windows.Forms.Label();
  85. this.txt3 = new System.Windows.Forms.TextBox();
  86. this.label4 = new System.Windows.Forms.Label();
  87. ((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).BeginInit();
  88. this.groupBox1.SuspendLayout();
  89. this.SuspendLayout();
  90. // 
  91. // dataGrid1
  92. // 
  93. this.dataGrid1.CaptionVisible = false;
  94. this.dataGrid1.DataMember = "";
  95. this.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText;
  96. this.dataGrid1.Location = new System.Drawing.Point(8, 72);
  97. this.dataGrid1.Name = "dataGrid1";
  98. this.dataGrid1.ReadOnly = true;
  99. this.dataGrid1.RowHeaderWidth = 0;
  100. this.dataGrid1.Size = new System.Drawing.Size(648, 392);
  101. this.dataGrid1.TabIndex = 0;
  102. // 
  103. // groupBox1
  104. // 
  105. this.groupBox1.Controls.Add(this.txt1);
  106. this.groupBox1.Controls.Add(this.label1);
  107. this.groupBox1.Controls.Add(this.txt2);
  108. this.groupBox1.Controls.Add(this.label2);
  109. this.groupBox1.Controls.Add(this.txt3);
  110. this.groupBox1.Controls.Add(this.label4);
  111. this.groupBox1.Location = new System.Drawing.Point(8, 8);
  112. this.groupBox1.Name = "groupBox1";
  113. this.groupBox1.Size = new System.Drawing.Size(644, 53);
  114. this.groupBox1.TabIndex = 1;
  115. this.groupBox1.TabStop = false;
  116. this.groupBox1.Text = "学生信息";
  117. // 
  118. // txt1
  119. // 
  120. this.txt1.Location = new System.Drawing.Point(88, 24);
  121. this.txt1.Name = "txt1";
  122. this.txt1.TabIndex = 1;
  123. this.txt1.Text = "";
  124. this.txt1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txt1_KeyPress);
  125. // 
  126. // label1
  127. // 
  128. this.label1.Location = new System.Drawing.Point(40, 28);
  129. this.label1.Name = "label1";
  130. this.label1.Size = new System.Drawing.Size(48, 16);
  131. this.label1.TabIndex = 0;
  132. this.label1.Text = "学号";
  133. this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
  134. // 
  135. // txt2
  136. // 
  137. this.txt2.Location = new System.Drawing.Point(272, 24);
  138. this.txt2.Name = "txt2";
  139. this.txt2.ReadOnly = true;
  140. this.txt2.TabIndex = 1;
  141. this.txt2.Text = "";
  142. // 
  143. // label2
  144. // 
  145. this.label2.Location = new System.Drawing.Point(224, 28);
  146. this.label2.Name = "label2";
  147. this.label2.Size = new System.Drawing.Size(48, 16);
  148. this.label2.TabIndex = 0;
  149. this.label2.Text = "姓名";
  150. this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
  151. // 
  152. // txt3
  153. // 
  154. this.txt3.Location = new System.Drawing.Point(480, 24);
  155. this.txt3.Name = "txt3";
  156. this.txt3.ReadOnly = true;
  157. this.txt3.TabIndex = 1;
  158. this.txt3.Text = "";
  159. // 
  160. // label4
  161. // 
  162. this.label4.Location = new System.Drawing.Point(432, 28);
  163. this.label4.Name = "label4";
  164. this.label4.Size = new System.Drawing.Size(48, 16);
  165. this.label4.TabIndex = 0;
  166. this.label4.Text = "班级";
  167. this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
  168. // 
  169. // CurriculumSchedule
  170. // 
  171. this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  172. this.ClientSize = new System.Drawing.Size(664, 469);
  173. this.Controls.Add(this.groupBox1);
  174. this.Controls.Add(this.dataGrid1);
  175. this.Name = "CurriculumSchedule";
  176. this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
  177. this.Text = "【课程表】";
  178. ((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).EndInit();
  179. this.groupBox1.ResumeLayout(false);
  180. this.ResumeLayout(false);
  181. }
  182. #endregion
  183. //----------设置明细表格各列的属性----------
  184. private void DataGridStateControl()
  185. {
  186. scheduleTable = new DataTable();
  187. scheduleTable.Columns.Add("星期一",typeof(string));
  188. scheduleTable.Columns.Add("星期二",typeof(string));
  189. scheduleTable.Columns.Add("星期三",typeof(string));
  190. scheduleTable.Columns.Add("星期四",typeof(string));
  191. scheduleTable.Columns.Add("星期五",typeof(string));
  192. this.dataGrid1.DataSource = scheduleTable;
  193. for(int i=0;i<7;i++)//向表中添加7行,代表一天有7节课
  194. {
  195. scheduleTable.Rows.Add(scheduleTable.NewRow());
  196. }
  197. DataGridTableStyle ts = new DataGridTableStyle();
  198. DataGridTextBoxColumn aColumnTextColumn;
  199. ts.AllowSorting = false;
  200. ts.AlternatingBackColor = Color.LightGray;
  201. ts.MappingName = scheduleTable.TableName;
  202. for (int i = 0;i< 5;i++)
  203. {
  204. aColumnTextColumn = new DataGridTextBoxColumn();
  205. aColumnTextColumn.ReadOnly=true;
  206. aColumnTextColumn.Width=120;
  207. aColumnTextColumn.TextBox.Height=50;
  208. aColumnTextColumn.MappingName = scheduleTable.Columns[i].ColumnName;
  209. aColumnTextColumn.HeaderText = scheduleTable.Columns[i].ColumnName;
  210. aColumnTextColumn.NullText = "";
  211. aColumnTextColumn.Format = "N"; //设置为数字格式显示
  212. ts.GridColumnStyles.Add(aColumnTextColumn);
  213. }
  214. dataGrid1.TableStyles.Add(ts);
  215. }
  216. //-----------读取学生的课表信息----------
  217. private void LoadCurriculumInfo(string id)
  218. { this.curriculumTable.Clear();//清除该学生的所选课程信息 string strConn="workstation id=localhost;Integrated Security=SSPI;database=eisbook;"; SqlConnection cn=new SqlConnection(strConn); cn.Open();
  219. string sql="select b.课程名称,b.教师,c.上课时间天,c.上课时间节,c.上课地点 "
  220. +"from 选课表 a,课程信息 b,课程表 c "
  221. +"where (a.课序号=c.课序号)and('200400000'+b.课程编号=a.课序号)"
  222. +"and(a.学号='"+id+"')";
  223. SqlDataAdapter da=new SqlDataAdapter(sql,cn);
  224. da.Fill(this.curriculumTable);//该学生的所选课程信息
  225. }
  226.         //---------读取学生信息-----------
  227. private void LoadStduentInfo(string id)
  228. { txt2.Clear();//清除学生信息 txt3.Clear(); string strConn="workstation id=localhost;Integrated Security=SSPI;database=eisbook;"; SqlConnection cn=new SqlConnection(strConn); cn.Open();
  229. SqlCommand cmd=cn.CreateCommand();
  230. cmd.CommandText="select a.姓名,b.班级名称,a.学籍编号 from 学生信息 a,班级信息 b "
  231. +"where(a.班级编号=b.班级编号)and(学号='"+id+"')";
  232. SqlDataReader dr=cmd.ExecuteReader();
  233. dr.Read();//读入数据
  234. if(!dr.HasRows)//判断学号是否输入正确
  235. {
  236. MessageBox.Show("无此学生,请重新输入学号","提示",MessageBoxButtons.OK,MessageBoxIcon.Stop);
  237. dr.Close();
  238. return;
  239. }
  240. if(dr.GetValue(2).ToString().Trim()!="1")//判断是否为在籍学生
  241. {
  242. MessageBox.Show("该学生并非在籍学生,无课表","提示",MessageBoxButtons.OK,MessageBoxIcon.Stop);                
  243. return;
  244. }
  245. txt2.Text=dr.GetValue(0).ToString().Trim();//姓名
  246. txt3.Text=dr.GetValue(1).ToString().Trim();//班级名称
  247. dr.Close();
  248. }
  249. //---------将所选课程信息填充在课程表中----------
  250. private void curriculmToSchedule()
  251. {
  252. this.scheduleTable.Clear();
  253. for(int i=0;i<7;i++)//向表中添加7行,代表一天有7节课
  254. {
  255. scheduleTable.Rows.Add(scheduleTable.NewRow());
  256. }
  257. foreach(DataRow aRow in this.curriculumTable.Rows)
  258. {
  259. int day=Convert.ToInt32(aRow["上课时间天"]);
  260. int sec=Convert.ToInt32(aRow["上课时间节"]);
  261. this.scheduleTable.Rows[sec-1][day-1]=aRow["课程名称"].ToString().Trim()+"n"
  262. +aRow["上课地点"].ToString().Trim()+"n"
  263. +aRow["教师"].ToString().Trim();
  264. }
  265. }
  266. //----------自动设置dataGrid中的行宽度--------
  267. public void AutoSizeGrid() 
  268.  
  269. {   
  270. int numRows = ((DataTable)dataGrid1.DataSource).Rows.Count; //该dataGrid所连接的表的宽度 
  271. Graphics g = Graphics.FromHwnd(dataGrid1.Handle);  
  272. StringFormat sf = new StringFormat(StringFormat.GenericTypographic); 
  273. SizeF size; 
  274.  
  275. //由于DataGrid没有提供对DataGridRows[]的直接调用,因此我们使用一个反射(relection)来实现它
  276. //这个方法实际上取得dataGrid中行的集合,通过get_DataGridRows方法返回Rows的集合
  277. //并转化为一个System.Array对象 
  278. MethodInfo mi = dataGrid1.GetType().GetMethod("get_DataGridRows", 
  279.  
  280. BindingFlags.FlattenHierarchy | BindingFlags.IgnoreCase | BindingFlags.Instance 
  281.  
  282. | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static); 
  283.  
  284. System.Array dgra = (System.Array)mi.Invoke(dataGrid1,null); 
  285.  
  286. // 将其转换为ArrayList
  287. ArrayList DataGridRows = new ArrayList();  
  288. foreach (object dgrr in dgra)  
  289. {  
  290. if (dgrr.ToString().EndsWith("DataGridRelationshipRow")==true) 
  291. DataGridRows.Add(dgrr);  
  292.  
  293. //枚举dataGrid中的所有行 
  294. for (int i = 0; i < numRows; ++i) 
  295.   {
  296. size = g.MeasureString(dataGrid1[i,1].ToString(),dataGrid1.Font,400,sf); 
  297.   int h = Convert.ToInt32(40);//直接将每行的行高设置为40
  298. //用下面这行代码可以根据dataGrid中字体自动调整行高
  299. //int h = Convert.ToInt32(size.Height); 
  300. // 考虑到表格表头的高度,可以适当加高 
  301. h = h + 8;  
  302. // 将定好的行高设置回dataGrid中 
  303. PropertyInfo pi = DataGridRows[i].GetType().GetProperty("Height");  
  304. pi.SetValue(DataGridRows[i],h,null);  
  305. }  
  306. g.Dispose();  
  307. }
  308. //----------输入学号后回车,显示课表信息和学生信息-----------
  309. private void txt1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
  310. {
  311. if(txt1.Text.Trim()!=""&&e.KeyChar==13)
  312. {
  313. this.LoadStduentInfo(txt1.Text.Trim());//读入学生信息
  314. this.LoadCurriculumInfo(txt1.Text.Trim());//读入选课表信息
  315. this.curriculmToSchedule();//将选课内容显示在课表中
  316. this.AutoSizeGrid();
  317. }
  318. }  
  319. }
  320. }