从BackgroundWorker访问ComboBox的数据

时间:2017-02-11 18:55:54

标签: c# combobox

我有一个非常奇怪的问题。我试图在背景工作者的dowork事件中从组合框中获取数据。

{{{0.698039, 0.996078, 0.262745}, {0., 0.266667, 1.}, {0.00392157, 
   0.25098, 0.996078}, {1., 0.65098, 0.}}, {{0.996078, 0.823529, 
   0.}, {0.498039, 0., 0.00392157}, {0.831373, 0.00392157, 
   0.00392157}, {0.956863, 0.972549, 0.00784314}}, {{0.909804, 
   0.00784314, 0.}, {0.87451, 0.996078, 0.0862745}, {0.196078, 
   0.992157, 0.760784}, {0.00392157, 0.00392157, 0.498039}}, {{1., 
   0.878431, 0.}, {0.588235, 0.00392157, 0.00392157}, {0.00392157, 
   0.0666667, 0.996078}, {0.996078, 0.517647, 0.}}}

这就是问题所在。它只是没有进入那里,即使它是真的。在正常的空隙中检查它并且它起作用,所以它只是在dowork事件中。但我怎么应该调用这个,我想我只需要调用当我试图修改ui上的对象。真的很奇怪,如果有人能够清除一点,我会很高兴的!

3 个答案:

答案 0 :(得分:0)

您需要使用我不记得如何在Windows窗体中访问的Dispatcher(它是遗留技术,我已经有近10年未触及它了)。在WPF中有一个静态的Application类,它暴露出来,但为了使你的ViewModel(或Windows Forms case Presenter)单元可测试,你应该将它暴露为一个可注入的接口。

答案 1 :(得分:0)

最好的选择是在启动<script> var para = document.createElement("p"); var node = document.createTextNode("This is new."); para.appendChild(node); var element = document.getElementById("div1"); element.appendChild(para); </script> 时简单地将所需数据(如果您的示例正确,将一个简单的字符串)传递给长时间运行的任务,以便它可以独立于UI运行。

如果您真的想从工作线程访问UI,可以这样做:

<div id="div1">
</div>

<script>
var tag ="ios,android,windows"; //initialize variable
var data = tag.split(","); //this makes an array of ios,andrid,windows
var i = 0;

while (i < 3){
  alert(i);
  var para = document.createElement("p");
  var node = document.createTextNode(data[i]);
  para.appendChild(node);
  var element = document.getElementById("div1");
  element.appendChild(para);
  i++;
} 
</script>

答案 2 :(得分:0)

另一个版本:

        string value = "";
        sortBox.Invoke(new MethodInvoker(delegate {
            if (sortBox.SelectedIndex != -1)
            {
                value = sortBox.SelectedItem.ToString();
            }
        }));
        Console.WriteLine("value = " + value);