【问题标题】:combobox add items throw Exception "Specific cast is not valid"组合框添加项目抛出异常“指定的转换无效”
【发布时间】:2015-03-10 16:26:20
【问题描述】:

您好,我有以下代码 将一些项目添加到组合框我在一个线程中执行代码我有以下异常“特定转换无效”但是在主窗体线程中执行它时也不例外。 知道如何解决这个问题吗?

        Control.CheckForIllegalCrossThreadCalls = false;

        //Auto Complete
        comboBox3.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
        comboBox3.AutoCompleteSource = AutoCompleteSource.ListItems;

        //no specific formatting
        comboBox3.FormattingEnabled = true;

        Thread th1 = new Thread(() =>
            {
                try
                {
                    //# Code Start

                    //Some Text 
                    String[] TicketStatus = new string[] { "a", "b", "c", "d", "e" };

                    //Throw Exception "Specific cast is not valid"
                    comboBox3.Items.AddRange(TicketStatus);

                    //# Code End
                }
                catch (Exception c) { MessageBox.Show(c.Message); }
            });
        th1.Start();

像这样没有例外

  Control.CheckForIllegalCrossThreadCalls = false;

        //Auto Complete
        comboBox3.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
        comboBox3.AutoCompleteSource = AutoCompleteSource.ListItems;

        //no specific formatting
        comboBox3.FormattingEnabled = true;


        //# Code Start

        //Some Text 
        String[] TicketStatus = new string[] { "a", "b", "c", "d", "e" };

        //Throw Exception "Specific cast is not valid"
        comboBox3.Items.AddRange(TicketStatus);

        //# Code End

【问题讨论】:

  • 您不应该更新线程上的 gui 控件。搜索 control.Invoke() 以从非 gui 线程更新控件。
  • 尽管我不喜欢这个CheckForIllegalCrossThreadCalls,但我不得不说你的代码在这里没有任何问题。

标签: c# .net winforms combobox


【解决方案1】:

您不能从 UI 线程以外的线程访问 UI 元素。

您必须将 setter 代码编组回 UI 线程。

使用InvokeRequired 这样做。

【讨论】:

  • 我可以使用以下代码做到这一点:Control.CheckForIllegalCrossThreadCalls = false;
  • 从来不理解像CheckForIllegalCrossThreadCalls 这样的坏代码实践属性。你应该忘记它的存在......
  • @Joeren 在单元测试中有时需要这些东西.. 但我一般同意
  • @DrKoch 是的,你可以试试。
  • 让大家知道CheckForIllegalCrossThreadCalls 被记录在案,它应该只用于便于调试。来自documentation将 CheckForIllegalCrossThreadCalls 设置为 true,以便在调试时更轻松地查找和诊断此线程活动。在非调试环境中,看起来该属性本身可能会被完全忽略。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多