private void radButton1_Click_1(object sender, EventArgs e)
        {
            var selectedproperty = (KeyValuePair <long, string>)coursesListBox1.SelectedItem; // 获取已经选择的项目

            if (selectedproperty.Key == -1)                                                   //判断是否有数据
            {
                MsgBox.ShowMsgBoxDialog("没有数据");
            }

            var rollCallingDetailRow = classInfoGview1.SelectedRows[0];

            var kkno = selectedproperty.Key;

            var skno = Convert.ToInt64(rollCallingDetailRow.Cells["上课编号"].Value);

            var ydSkdate = Convert.ToString((rollCallingDetailRow.Cells["上课日期"].Value));

            var kkname = Convert.ToString(selectedproperty.Value);

            //验证离线密码
            var offlineVerifyResault = BriefcaseControl.VerifyOfflinePasswd(kkno);

            if (!offlineVerifyResault)
            {
                MsgBox.ShowMsgBoxDialog("验证口令失败");

                return;
            }
            // 如果验证不通过 则提示密码错误 并返回 什么都不做.
            //todo:指纹点名的业务逻辑在这里编写即可 需要从界面里带出去的东西:1.上课编号2.课程编号 3.实际上课时间

            //把预定上课时间传出去
            var getRollCallTimeForm = new SetTimeForm(Convert.ToDateTime(ydSkdate));

            var getRollCallTimeResault = getRollCallTimeForm.ShowDialog(); // 显示设置时间窗口

            if (getRollCallTimeResault == DialogResult.Cancel)             // 如果点击了返回 那么就不要再往下走了.
            {
                return;
            }

            var actualRollCallTime = getRollCallTimeForm.GetActualRollCallTime();

            var skrecordList = OfflineDataControl.GetSktable(kkno);   // 将来需要把这个拿来更新上课表

            //var skrecord = (from c in skrecordList where c.SKNO == skno select c).First (); // linq  完了以后把第一条记录取出来(一共就有一条记录.)

            //FindIndex(a => a.SKNO == (long) sktableRow["SKNO"])

            var skrecordIndex = skrecordList.FindIndex(a => a.SKNO == skno);

            var skrecord = skrecordList[skrecordIndex];

            skrecord.SKZT = 3;

            skrecord.DMFS = 1;

            skrecord.SKDATE = actualRollCallTime;

            OfflineDataControl.SaveSkTable(skrecordList, kkno);  // 存上课表


            courseNameLbl2.Text = kkname;                                  // 课程名称 label内容

            expectedTeachingTimeLbl.Text = ydSkdate;                       // 预定上课时间 label内容

            teacherNameLbl2.Text = teacherNameLbl1.Text;                   // 教师姓名 label内容

            actualTeachingTimeLbl.Text = actualRollCallTime.ToString("f"); //实际上课时间内容

            var studentList = RollCallControl.Init(kkno, skno, actualRollCallTime);

            //对于RollCallControl来说 这个委托是用来更新界面的.具体怎么更新界面他不用管 所以不用改名
            var showStudentInformationDelegate =
                new RollCallControl.UpdateUserInterfaceDelegate(ShowStudentInformation);

            RollCallControl.StartRollCall(studentList, showStudentInformationDelegate);

            mainPageView.SelectedPage = startRollCallPage;

            dp_ResetMainForm();

            dp_EnableRollcallButtons();

            rollCallStudentListGv.DataSource = RollCallControl.CopyOfStudentList;


            //todo:接下来要做的事情:
            //1.打开指纹仪
            //2.识别出来的号码拿出来 放到Student List里查 查完了把Student对象扔到界面委托里显示.
            //3.用while(bool变量)控制结束签到
            //4.结束签到的时候直接closeUsb即可
            //写一个函数 传入更新界面的Delegate 该函数需要在一个新的线程里编写.
        }