private System.Timers.Timer _timer = new System.Timers.Timer();
        public void PrintData(MessageEntity mess)
        {
            try
            {
                //this.dgvMessage.
                // int a = dgvMessage.Rows.Count;
                int maxRows = 2000;//配置文件可设置
                 CheckForIllegalCrossThreadCalls = false;                if (dgvSend.Rows.Count < maxRows)
                {                    dgvSend.Rows.Insert(0, 1);
                }
                else
                {
                    dgvSend.Rows.RemoveAt(maxRows - 1);
                    dgvSend.Rows.Insert(0, 1);
                }
                //this.dgvMessage.Rows.Add(string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty);
                //dgvMessage.CurrentCell = dgvMessage.Rows[0].Cells[0];
                //this.dgvMessage.Rows[0].Cells[0].Value = RowNumberA;
                dgvSend.Rows[0].Cells[0].Value = mess.RowTypeA;
                dgvSend.Rows[0].Cells[1].Value = mess.BankNumber;
                dgvSend.Rows[0].Cells[2].Value = mess.Describe;
                dgvSend.Rows[0].Cells[3].Value = mess.TakeData;
                dgvSend.Rows[0].Cells[4].Value = mess.InOrTo;
                dgvSend.Rows[0].Cells[5].Value = mess.FileName;
            }
            catch (Exception ex)
            {
            }
        }
        /// <summary>
        /// 定时操作的具体内容
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void ReadAttendanceData(object sender, ElapsedEventArgs e)
        {
            _timer.Stop();
            SendReportOpera();
            _timer.Start();
        }
        /// <summary>
        /// 设置定时启动
        /// </summary>
        /// <param name="timePart">每隔多久执行</param>
        protected void SetVariable(int timePart)
        {
            // _timer = new System.Timers.Timer();
            _timer.Elapsed += new ElapsedEventHandler(ReadAttendanceData);
            _timer.Interval = timePart;
            _timer.Enabled = true;
            _timer.AutoReset = true;
            _timer.Start();
        }
private void SendReportOpera()
        {
            DataSet ds = xmlh.ConvertXMLFileToDataSet();
            DataTable dt = ds.Tables[0];
            int jieguo = -1;
            for(int i=0;i<dt.Rows.Count;i++)
            {
                MessageEntity mes = new MessageEntity();
                int result = srMan.InsertDBBySend(dt.Rows[i]["BRANCHID"].ToString(), oper, out mes);
                loge.LogEvent(mes);
                PrintData(mes);
                MessageEntity mess = new MessageEntity();
                ds = srMan.GetDataByBranchId(dt.Rows[i]["BRANCHID"].ToString(), oper, out mess, out jieguo);
                loge.LogEvent(mess);
                PrintData(mess);
                if (jieguo == 0)
                {
                    MessageEntity mes1 = new MessageEntity();
                    srMan.InsertDBBySend(dt.Rows[i]["BRANCHID"].ToString(), oper, out mes);
                }
                //for(int 
            }
        }

解决方案 »

  1.   

    补充下,现在报错,报线程间操作无效: 从不是创建控件“dgvSend”的线程访问它~~~的解决方法~
      

  2.   

    查看这个http://topic.csdn.net/u/20100510/12/2fc74a41-6c2b-4a9a-bf23-41ca47ae77c1.html
      

  3.   

    线程访问主进程控件,使用委托http://www.cnblogs.com/mokey/articles/2095457.html
      

  4.   

    Form.CheckForIllegalCrossThreadCalls = false;   初始化程序的时候 声明这个
      

  5.   

    Form.CheckForIllegalCrossThreadCalls = false;   
    这个貌似有别的隐藏问题哦委托不是很熟,大家针对我这个情况,给个具体点的答案,跪求!
      

  6.   

    把这个方法改一下
    private void SendReportOpera()
            {
                DataSet ds = xmlh.ConvertXMLFileToDataSet();
                DataTable dt = ds.Tables[0];
                int jieguo = -1;
                this.BeginInvoke(new Action(() =>
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        MessageEntity mes = new MessageEntity();
                        int result = srMan.InsertDBBySend(dt.Rows[i]["BRANCHID"].ToString(), oper, out mes);
                        loge.LogEvent(mes);
                        PrintData(mes);
                        MessageEntity mess = new MessageEntity();
                        ds = srMan.GetDataByBranchId(dt.Rows[i]["BRANCHID"].ToString(), oper, out mess, out jieguo);
                        loge.LogEvent(mess);
                        PrintData(mess);
                        if (jieguo == 0)
                        {
                            MessageEntity mes1 = new MessageEntity();
                            srMan.InsertDBBySend(dt.Rows[i]["BRANCHID"].ToString(), oper, out mes);
                        }
                        //for(int 
                    }
                }));
            }要访问UI的时候,必须让代码切入到主线程去执行,这时候就要把代码委托到this.BeginInvoke或者this.Invoke中
      

  7.   

    GOOGLE关键字“委托,INVOKE”,工作线程需要更新UI控件内容,需要用委托切换到主线程上来完成。
      

  8.   

    窗体加载的时候,里面加上这句话试试
      Control.CheckForIllegalCrossThreadCalls = false;//"线程间操作无效: 从不是创建控件的线程访问它"解决方法  
      

  9.   

    SendReportOpera 方法里两处 PrintData(mess); 都改成如下代码
    this.Invoke((MethodInvoker)(() => PrintData(mess)));
      

  10.   

    最简单的处理方式就是在窗体的初始化事件中,加上
    控件类型.CheckForIllegalCrossThreadCalls = false或者使用委托。
      

  11.   

    http://blog.csdn.net/xianfajushi/article/details/7609849
      

  12.   

    public delegate void delPrintData();
            public void PrintData()
            {
                if (this.InvokeRequired)
                {
                    delPrintData del = new delPrintData(PrintData);
                    this.Invoke(del, new object[] { });
                }
                else
                { 
                    //在这里写对控件进行操作的代码            
                }
            }
      

  13.   

     this.Invoke(del, new object[] { 有参数就把参数写在这里});
      

  14.   

    11楼,你真帮了我一个大忙,谢谢了!
    再说下,在多线程中CheckForIllegalCrossThreadCalls = false
    不可随便用,比如说你我这个问题,用了后很容易造成DataGridView假死,滚动条无法使用的情况!