【问题标题】:Running Backgroundworker from another Form从另一个表单运行 Backgroundworker
【发布时间】:2017-11-29 06:34:21
【问题描述】:

我有 2 个表格。表格 1 和表格 2。 Form1从弹出的form2中获取日期间隔。

Form2 有搜索按钮。搜索按钮如下;

 //form2
private void ubSAVE_Click(object sender, EventArgs e)
{
Form1 f1= new Form1();

f1.minDateCustomIO = Convert.ToDateTime(minDateString);
f1.maxDateCustomIO = Convert.ToDateTime(maxDateString);
f1.customIO = uosIO.CheckedIndex;

if (!f1.bgwCustomIO.IsBusy)
{
    f1.bgwCustomIO.RunWorkerAsync(); // run bgw on form1
}
}

Form1 上的 bgw 将数据加载到数据表等。一切正常。只有一个除外;

然后我在该 bgw 上使用 RunWorkerCompleted 事件,如下所示;

//form1
public void bgwCustomIO_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
    ultraGrid1.DataSource = dtCustomIOM; // Here is the problem. 
    MessageBox.Show(dtCustomIOM.Rows.Count.ToString());
}

MessageBox 验证我在该数据表中有行但是我不能分配给网格。

没有错误,没有。我也将它们的修饰符更改为 public。

只是它没有分配它。这背后的原因是什么,我该如何解决?

【问题讨论】:

  • 您的方法看起来是正确的,但是您在哪里声明了 bgwCustomIO_RunWorkerCompleted 事件以及 dtCustomIOM 对象的确切类型。将数据表分配给 ultrawingrid 没有任何问题。见Ref
  • @NiranjanKala 我认为来自另一个表单/实例的调用存在问题。因为如果我这样做而不使用其他形式。它有效。
  • 你有Form1 用于打开Form2 然后在Form2 中你有问题中的代码,我说得对吗?
  • @Enigmativity 是的,Form1 打开 form2。而form2在form1上触发bgworker
  • @johntrue - 您在 Form2 中的代码正在创建一个全新的 Form1 实例,因此您有两个 Form1 实例 - 您可能正在正确更新第二个 Form1,但是第一个实例不变。

标签: c# winforms


【解决方案1】:

您有 Form1 用于打开 Form2,然后在 Form2 创建一个全新的 Form1 实例,因此您有两个 Form1 实例 - 您正在更新第二个 @987654326 @ 正确,但第一个实例没有改变。

您只需在创建 Form1 时将引用传递给 Form2。然后使用现有的引用而不是创建一个新的。

做这样的事情:

public class Form2 : Form
{
    private Form1 _form1;
    public Form2(Form1 form1)
    {
        _form1 = form1;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多