private bool StartDownloadData(JSANDKKVIEWRO kktable05, string offlinePasswd) // 一门开课课程 { ProgressHelper.StartProgressThread(); // 开始显示进度条 Briefcase newBriefcase = new FileBriefcase(string.Format( GlobalParams.CurrentOfflineDataFile, kktable05.KKNO.ToString())); // 在内存中新建一个Briefcase 名字为该课程的开课编号 ProgressHelper.SetProgress(5); // 进度 百分之5 DataTable classRecordTable = null; // 一张上课表 对应每一节课 DataRow classRecordRow = null; classRecordTable = new DataTable("ClassStatus"); if (!classRecordTable.Columns.Contains("Table编号")) //这里算是一个BUG. 需要重新写. { classRecordTable.Columns.Add("Table编号", type: Type.GetType("System.String")); classRecordTable.Columns.Add("课次", type: Type.GetType("System.String")); classRecordTable.Columns.Add("签到情况", type: Type.GetType("System.String")); classRecordTable.Columns.Add("离线数据提交情况", type: Type.GetType("System.String")); } newBriefcase.Properties.Add(GlobalParams.PropertiesLastModified, DateTime.Now.ToString()); // 在briefcase中增加一个属性 用于记录最后一次更改的日期 newBriefcase.Properties.Add(GlobalParams.PropertiesTeacherName, Properties.Settings.Default.UserName); //增加一个属性 用于记录教师姓名 ProgressHelper.SetProgress(6); // 进度 百分之6 newBriefcase.Properties.Add(GlobalParams.PropertiesTeacherID, Properties.Settings.Default.UserId); // 增加一个属性 用于记录教师工号 newBriefcase.Properties.Add(GlobalParams.PropertiesPasswd, offlinePasswd);//用于记录离线密码. newBriefcase.Properties.Add(GlobalParams.PropertiesClassName, kktable05.KKNAME);//增加一个属性 用于记录开课名称 newBriefcase.Properties.Add(GlobalParams.PropertiesLastCheckin, "1"); //用于记录最后一次考勤的节次 ProgressHelper.SetProgress(10); //进度 百分之10 newBriefcase.Properties.Add(GlobalParams.PropertiesTotalStudentNumber, kktable05.XXRS.ToString()); //增加一个属性 用于记录选学人数 IQueryable <XKTABLE_VIEWRO> xktableView1s = from c in remoteDataAdapter.GetTable <XKTABLE_VIEWRO>() where c.KKNO == kktable05.KKNO select c; //构造LINQ语句 (选课表 XKTABLE_VIEWRO 学生信息) ProgressHelper.SetProgress(20); //进度 百分之15 newBriefcase.AddTable( OfflineHelper.TableListToDataTable (xktableView1s.ToList(), "XKTABLE_VIEW1")); // 将XKTABLE_VIEWRO(学生信息)放在briefcase里 IQueryable <SKTABLE_07_VIEW> sktableView1s = from c in remoteDataAdapter.GetTable <SKTABLE_07_VIEW>() where c.KKNO == kktable05.KKNO && c.SKDATE > new DateTime(2014, 10, 14) select c;//SKTABLE_07_view为教师的上课表.教师选择完课程之后需要选择节次. //节次的来源即为该表. 一节课一条记录 //将大于10月14号的数据下载下来 10月14日之后的数据都是正常的数据. //进度 百分之二十 newBriefcase.AddTable(OfflineHelper.TableListToDataTable(sktableView1s.ToList(), "SKTABLE")); // 下载SKTABLE_07_VIEW 并将其添加进briefcase中 里面包含了课程的信息 //百分之20 ProgressHelper.SetProgress(20); foreach (var sktableView1 in sktableView1s) { //开始遍历上课表,并根据SKNO(上课编号) 获取每一节课对应的DMTABLE_08_NOPIC_VIEW Properties.Settings.Default.ProgressValue += 2; // 进度指示 IQueryable <DMTABLE_08_NOPIC_VIEW> dmtable08S = // 构造LINQ语句 此处算法应改进 from c in remoteDataAdapter.GetTable <DMTABLE_08_NOPIC_VIEW>() where c.SKNO == sktableView1.SKNO select c;//每一节课对应一张点名表 newBriefcase.AddTable( OfflineHelper.TableListToDataTable(dmtable08S.ToList(), sktableView1.SKNO.ToString()));//将点名表加入briefcase classRecordRow = classRecordTable.NewRow(); //在课程记录表中新建一行记录. 包含该节课是否已经签到的标记 classRecordRow[0] = sktableView1.SKNO.ToString(); //上课编号 classRecordRow[1] = sktableView1.SKDATE.ToString(); //上课时间 if (sktableView1.SKZT == 0) //判断考勤状态 若已经完成考勤,则该堂课不能进行考勤工作. { classRecordRow[2] = GlobalParams.DidNotSigned; classRecordRow[3] = GlobalParams.NotSubmitYet; } else { classRecordRow[2] = GlobalParams.Signed; classRecordRow[3] = GlobalParams.Submitted; } classRecordTable.Rows.Add(classRecordRow); //将刚创建的这一行添加到表中. } ProgressHelper.SetProgress(80); // 进度条 newBriefcase.AddTable(classRecordTable); // 将用于记录每节课的表放在briefcase中 newBriefcase.WriteBriefcase(); //保存briefcase到硬盘上 Briefcase propertiesBriefcase = new FileBriefcase(GlobalParams.PropertiesBriefcaseName, true);//true代表提前读取数据 DataTable propertiesTable = propertiesBriefcase.FindTable("PropertiesTable"); //本地的打开properties表 向其中添加一条记录 properties表中包含了所有的已经离线的开课记录 DataRow propertiesRow = null; //创建一个记录变量 propertiesRow = propertiesTable.NewRow(); //new出来一条记录 propertiesRow[0] = kktable05.KKNO.ToString(); //开课编号 propertiesRow[1] = Properties.Settings.Default.UserName; //用户名 propertiesRow[2] = kktable05.KKNAME; //开课名称 DataRow[] dataRows = propertiesTable.Select("开课编号 = '" + kktable05.KKNO.ToString() + "'"); //判断该课程是否已经添加进propertiestable中 if (dataRows.Length >= 1) // propertiestable已经有了该课程 { foreach (var dataRow in dataRows) { dataRow.Delete();//删除该课程 } propertiesTable.Rows.Add(propertiesRow);//添加该课程(更新) } else { propertiesTable.Rows.Add(propertiesRow); //添加该课程(新增) } ProgressHelper.SetProgress(90); //设置进度条 propertiesBriefcase.RemoveTable("PropertiesTable"); //移除propertiestable(必要的操作) propertiesBriefcase.AddTable(propertiesTable); //添加propertiestable propertiesBriefcase.WriteBriefcase(); //写入更改 ProgressHelper.SetProgress(100); //进度条显示100% ProgressHelper.StopProgressThread(); //停止显示进度条窗口 ProgressHelper.SetProgress(0); //重置进度条窗口 MessageBox.Show(string.Format("操作成功 课程 【{0}】 已被下载 ", kktable05.KKNAME));//弹窗提示 return(true); }
/// <summary> /// 用于下载数据时 briefcase的创建 /// 在确认下载数据后, 该函数会自动在properties briefcase中创建一条记录. /// </summary> /// <param name="kkrecord">一条开课记录</param> /// <returns></returns> public static FileBriefcase CreateBriefcase(JSANDKKVIEWRO kkrecord) { DialogResult dialogresault; if (File.Exists(GlobalParams.BriefcasePath + kkrecord.KKNO + @".daBriefcase")) // 判断briefcase是否存在 { dialogresault = new ConfirmBox("选定的课程 " + kkrecord.KKNAME + " 已经存在,\n还要下载该课程吗?").ShowDialog(); if (dialogresault == DialogResult.Cancel) { return(null); } dialogresault = new ConfirmBox("真的要下载该课程吗? \n未保存的数据将会被删除.").ShowDialog(); if (dialogresault == DialogResult.Cancel) { return(null); } dialogresault = new SetOfflinePasswdForm().ShowDialog(); // 显示离线密码框 指定离线密码 if (dialogresault == DialogResult.Cancel) // 如果用户点击取消的话 { return(null);//返回null 在调用的位置需要进行判定.如果为null 则不下载课程 }//离线密码存在 Properties.Settings.Default.OffliePassword 里面. File.Move(GlobalParams.BriefcasePath + kkrecord.KKNO + @".daBriefcase", GlobalParams.BriefcasePath + kkrecord.KKNO + @".daBriefcase" + DateTime.Now.ToString("yyyymmmmddhhmmss")); // 若存在 则重命名该briefcase. } else { dialogresault = new SetOfflinePasswdForm().ShowDialog(); // 显示离线密码框 指定离线密码 if (dialogresault == DialogResult.Cancel) // 如果用户点击取消的话 { return(null);//返回null 在调用的位置需要进行判定.如果为null 则不下载课程 }//离线密码存在 Properties.Settings.Default.OffliePassword 里面. } var briefcaseToReturn = new FileBriefcase(GlobalParams.BriefcasePath + kkrecord.KKNO + @".daBriefcase"); //返回的briefcase内为该门课程所有的数据 包括点名表 上课表 学生信息(选课表) 还有一个每节课信息(ClassStatus) //指定Briefcase的属性 briefcaseToReturn.Properties.Add(GlobalParams.BpkCourseName, kkrecord.KKNAME); // 开课课程名称 briefcaseToReturn.Properties.Add(GlobalParams.BpkCourseNo, kkrecord.KKNO.ToString(CultureInfo.InvariantCulture)); //课程编号 briefcaseToReturn.Properties.Add(GlobalParams.BpkLastModifiedDate, "N/A"); //最后一次签到时间 briefcaseToReturn.Properties.Add(GlobalParams.BpkTeacherName, kkrecord.JSNAME); //教师姓名 briefcaseToReturn.Properties.Add(GlobalParams.BpkTeacherNo, kkrecord.JSID.ToString(CultureInfo.InvariantCulture)); // 教师编号 briefcaseToReturn.Properties.Add(GlobalParams.BpkPassword, Properties.Settings.Default.OffliePassword); //离线密码 var classInfoTable = new DataTable("ClassInfo"); // 里面应该存放每节课的信息. 该datatable应该放在对应课程的briefcase中 这个表是空的.将会在DataDownloadControl中对此表进行填充. classInfoTable.Columns.Add("上课编号", typeof(string)); classInfoTable.Columns.Add("上课日期", typeof(string)); classInfoTable.Columns.Add("上课状态", typeof(string)); briefcaseToReturn.AddTable(classInfoTable); //添加上面创建的datatable briefcaseToReturn.WriteBriefcase(); //写入硬盘 long xyid = Convert.ToInt64(kkrecord.XYID); var propertiesBriefcase = InitPropertiesBriefcase(xyid); //找出 properties briefcase 若properties不存在 该函数会自动创建一个propertiesbriefcase //xyid用于下载班级定义表用的.因此 var courseInfoDataTable = propertiesBriefcase.FindTable("CourseInfo"); // 找到course info 表 if (!courseInfoDataTable.Select("课程编号='" + kkrecord.KKNO.ToString() + "'").Any()) //如果之前没下载过该课程的话 { var courseInfoTableRow = courseInfoDataTable.NewRow(); //新建一行记录 courseInfoTableRow["课程名称"] = kkrecord.KKNAME; //添加课程名称 courseInfoTableRow["课程编号"] = kkrecord.KKNO.ToString(CultureInfo.InvariantCulture); //添加课程编号 courseInfoDataTable.Rows.Add(courseInfoTableRow); //将新创建的一行加入课程信息表中 propertiesBriefcase.AddTable(courseInfoDataTable); //将课程信息存到Properties Briefcase中 propertiesBriefcase.WriteBriefcase(); //写入更改 } return(briefcaseToReturn); }