예제 #1
0
        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);
        }
예제 #2
0
        /// <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);
        }