/// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSave_Click(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            string btnStr = string.Empty;
            try
            {
                if (btn != null)
                {
                    btnStr = btn.Text;
                    btn.Text = "处理中...";
                    btn.Enabled = false;
                }
                string[] checkStudentWorks = GetSelectedThumbnails(this.panelWork);
                if (checkStudentWorks == null || checkStudentWorks.Length == 0)
                {
                    this.OnMessageEvent(MessageType.Normal | MessageType.PopupInfo, "请选中学生作业后方可保存!");
                    btn.Text = btnStr;
                    btn.Enabled = true;
                    return;
                }
                LocalWorkReview teaReview = Tools.GetEvaluateFromWin(this.store, this.cbbReviewValue, this.txtSubjectiveReviews);
                if (teaReview == null)
                {
                    this.OnMessageEvent(MessageType.Normal | MessageType.PopupInfo, "请评阅后方可保存!");
                    btn.Text = btnStr;
                    btn.Enabled = true;
                    return;
                }
                btn.Text = "保存中..";
                bool bPublish = this.chkPublish.Checked, bUpload = this.chkUpload.Checked;
                this.store = LocalStudentWorkStore.DeSerializer(this.store.FileSavePath());
                for (int i = 0; i < checkStudentWorks.Length; i++)
                {
                    LocalStudent ls = this.store.Students[checkStudentWorks[i]];
                    if (ls != null && ls.Work != null)
                    {
                        WorkStoreHelper.WorkReviewQueueEntity entity = new WorkStoreHelper.WorkReviewQueueEntity(ls.StudentID,
                                                                                                         ls.Work.WorkID,
                                                                                                         bPublish ? (EnumWorkStatus.Review | EnumWorkStatus.Release) : EnumWorkStatus.Review,
                                                                                                         teaReview,
                                                                                                         this.store.FileSavePath());
                        entity.Changed += new RaiseChangedHandler(delegate(string msg)
                        {
                            this.OnMessageEvent(MessageType.Normal, msg);
                        });
                        //添加到保存队列。
                        WorkStoreHelper.ReviewWorkToQueueStore(entity);
                        this.OnMessageEvent(MessageType.Normal, string.Format("开始保存[{0},{1}]作业批阅...",ls.StudentName, ls.Work.WorkName));
                    }
                }

                if (bUpload)
                {
                    btn.Text = "上传中...";
                    WorkUploadToServer win = new WorkUploadToServer(this.CoreService, this.store, checkStudentWorks);
                    win.StartPosition = FormStartPosition.CenterParent;
                    win.Changed += new RaiseChangedHandler(delegate(string msg)
                    {
                        this.OnMessageEvent(MessageType.Normal, msg);
                    });
                    win.ShowDialog(this);
                }

                btn.Text = "刷新状态...";
                //刷新学生作品评阅状态。
                for (int i = 0; i < checkStudentWorks.Length; i++)
                {
                    StudentEx stuEx = Program.STUDENTS != null ? Program.STUDENTS[checkStudentWorks[i]] : null;
                    if (stuEx != null && ((stuEx.Status & StudentControl.EnumStudentState.Review) != StudentControl.EnumStudentState.Review))
                    {
                        stuEx.Status |= StudentControl.EnumStudentState.Review;
                        if (this.NetService != null) this.NetService.OnUpdateControls(stuEx);
                    }
                }

                //
                this.DialogResult = DialogResult.OK;
                this.Close();

            }
            catch (Exception ex)
            {
                Program.GlobalExceptionHandler(ex);
                this.OnMessageEvent(MessageType.Normal, "发生异常:" + ex.Message);
            }
            finally
            {
                if (btn != null)
                {
                    btn.Text = btnStr;
                    btn.Enabled = true;
                }
            }
        }
        /// <summary>
        /// 上传作业
        /// </summary>
        /// <param name="poxy"></param>
        /// <param name="swp"></param>
        private void uploadWorks(TeaClientServicePoxyFactory poxy, StudentWorkUpload swp)
        {
            try
            {
                if (swp.Number > this.repeatNumber)
                {
                    swp.Progress.UploadFailure("已重复上传[" + (swp.Number - 1) + "]次达到最大限定次数!");
                    return;
                }
                string err = null;
                swp.Number += 1;
                if ((swp.Status = poxy.UploadStudentWorks(swp, out err) ? 1 : -1) == 1)
                {
                    WorkStoreHelper.WorkReviewQueueEntity entity = new WorkStoreHelper.WorkReviewQueueEntity(swp.Student.StudentID, swp.Student.Work.WorkID, EnumWorkStatus.Upload, null, swp.Store.FileSavePath());
                    entity.Changed += this.OnChanged;
                    WorkStoreHelper.UpdateWorkStatusToQueueStore(entity);
                    this.OnChanged("开始保存[" + swp.Student.StudentName + "," + swp.Title + "]作业状态...");
                }
                else if (!string.IsNullOrEmpty(err))
                {
                    this.OnChanged("[" + swp.Title + "]" + err);
                }

                if (swp.Status == -1 && swp.Number <= this.repeatNumber)
                {
                    this.uploadFailureQueue.Enqueue(swp);
                }
            }
            catch (Exception exp)
            {
                swp.Progress.UploadFailure(exp.Message);
                this.OnChanged("上传[" + swp.Student.StudentName + "," + swp.Title + "]时发生异常:" + exp.Message);
                Yaesoft.SFIT.Client.Utils.UtilTools.OnExceptionRecord(exp, this.GetType());
            }
        }