先交代下我的情况:我的form上有一个datagridview,下面有一个ToolStrip,ToolStrip上有个StatusLabel,交代完毕了。
我有个线程是访问这statusLabel的,但是报错说是,非创建datagridview的线程,不能访问下面这句代码:
statusLabel.Text = thisKeywordCount + "/" + totalCount; 是debug直接定位到了这行的。
很奇怪啊,我在更新的是statusLabel怎么报错说非创建datagridview的线程呢,我又访问的不是datagridview,高手看看会是啥情况导致这个的呢

解决方案 »

  1.   

    这个线程调用的是这句话的嘛,StatusLabel的这句话,没有调用Datagridview的嘛
     
      

  2.   

    在Load事件中加CheckForIllegalCrossThreadCalls = false;
      

  3.   

    .NET 是STA模型的,UI是单线程的,访问UI元素只能在UI线程中才行。你可以在UI代码中用.Invork,这样就能回到UI线程了!
      

  4.   


    没弄明白,datagridview是控件,StatusLabel就不是控件了吗?
      

  5.   

    哥,你回去看看哪些类才算是真正的控件,看看他们父类,哪些控件才有InvokeRequired方法,再看看我代码中描述的是什么意思
      

  6.   

    没有哈兄弟,别皆以别介意,我说话就这样子,没恶意啊。
    算控件,我的问题中能沾上边的起码是这样子的,首先它要继承controlls类,然后才算是组件类。才会出现那样的类似问题,statuslabel不算的。再说,我代码中操作的是StatusLabel,而给出的是非创建gridview的线程是不能访问,它明显把这个StatusLabel当作是了gridview了。。
      

  7.   

    刚找到篇帖子:http://www.it44.com/article/20090415/432_2.html帖子最后提到:
    System.Windows.Forms中ToolStripItem继承链上的控件并不具有后向兼容性,因此以上code pattern对此类控件不适用;可以将以上code pattern改为如下具体原理待高手解释了。
      

  8.   

    CheckForIllegalCrossThreadCalls = false;
    ThreadStart start = new ThreadStart(Check);
    -----------------------------------------
    check为方法名但是在线程里面不要加()
      

  9.   

    CheckForIllegalCrossThreadCalls = false;
    还是不要加的好 记得有人说过这个方法相当于把所有控件释放 无论哪个线程都可以用了 肯定不稳定了!
    感觉还是.Invork比较好 但是处理比较复杂。
    真不能太纠结于报错,有时候还真是莫名其妙的信息!
      

  10.   


    你不需要在StatusLabel上去找Invoke,在GridView甚至Form上都可以用Invoke执行你的设置StatusLabel的那个方法。不是非得去写StatusLabel.Invoke。
      

  11.   

    你的StatusLabel只是组件,不是控件。不过它是触发父控件的方法在它所在的子线程上执行的。
      

  12.   

    是的,我有同感,所以我都是invoke
      

  13.   

    非创建datagridview的线程 不就是 非UI线程嘛 这样说也没错 - -!sp1234说的对 this.Invoke()就可以了
      

  14.   

    1 CheckForIllegalCrossThreadCalls = false; 千万别信。以前.net 1.0曾经说这样是可以,但现在,可能肯定地 说,会出现未知错误。
    2 用户线程和UI线程的区别,建议你去了解下,然后你就知道问题原因了。不要为了解决问题而解决。这个问题在C++ C# 都一样,你不了解,随便你写什么代码都会出问题。
    3 statusLabel 肯定不用再你线程改的。看这个帖子就知道怎么办
       http://topic.csdn.net/u/20110825/23/704f7f2a-6e9b-427c-8277-75ba80954594.html
      

  15.   

    哥,你给的地址还是我发的帖子,不过还是谢谢你,你怎么确定Statuslabel不是在我这个线程中修改的?
      

  16.   

    我的问题不是这个答案,我问的是我明显操作的不是DataGirdView但是提示我是操作了DataGridView
      

  17.   

    StatusLabel的父控件怎么也不会是DataGridView吧
      

  18.   

    Statuslabel 在UI线程。你创建的是用户线程。用户线程一般是无法创建控件的。所以Statuslabel 肯定在你的UI线程里创建的
      

  19.   

    他告诉你,不是他创造的线程,所以出错。这句话实际上误导了你。
    不是因为你访问的控件不是你创建的(当然,实际上的确不是你创建的)。实际上是控件都是UI线程创建的,你创建的用户线程(也可以叫非UI线程)无论如何都不该直接修改控件属性。
    C#用委托方式处理。C++是消息方式处理。最后都是把操作放到UI线程上为目的。