1

我正在尝试使用委托使用在不同的类和线程中计算的一些数据来更新 datagridview。不幸的是,根据我尝试的方法,我遇到了各种不同的错误。

我试图在表单线程中执行的代码如下所示:

public partial class AcquireForm : Form
//
// ...
//
    // update the grid with results
    public delegate void delUpdateResultsGrid(int Index, Dictionary<string, double> scoreCard);
    public void UpdateResultsGrid(int Index, Dictionary<string, double> scoreCard)
    {
        if (!this.InvokeRequired)
        {
            //
            // Some code to sort the data from scoreCard goes here
            //

            DataGridViewRow myRow = dataGridViewResults.Rows[Index];
            DataGridViewCell myCell = myRow.Cells[1];
            myCell.Value = 1; // placeholder - the updated value goes here
            }
        }
        else
        {
            this.BeginInvoke(new delUpdateResultsGrid(UpdateResultsGrid), new object[] { Index, scoreCard});
        }
    }

现在,我需要让这个方法从我的其他线程和类中运行。我努力了:

public class myOtherClass
//
// ...
//

    private void myOtherClassMethod(int myIndex)
    {
        // ...
        AcquireForm.delUpdateResultsGrid updatedelegate = new AcquireForm.delUpdateResultsGrid(AcquireForm.UpdateResultsGrid);
        updatedelegate(myIndex, myScoreCard);
    }

不幸的是,这给出了“非静态字段、方法或属性 AcquireForm.UpdateResultsGrid(int, System.Collections.Generic.Dictionary) 需要对象引用”错误。我似乎根本无法引用 UpdateResultsGrid 方法......

我注意到

public class myOtherClass
//
// ...
//

    private void myOtherClassMethod(int myIndex)
    {
        // ...
        AcquireForm acquireForm = new AcquireForm();
        acquireForm.UpdateResultsGrid(myIndex,myScoreCard);
    }

编译时不会抛出任何错误,但它会尝试创建一个新表单,这是我不想做的事情。我不想创建 AcquireForm 的新实例,如果可能的话,我想引用预先存在的实例。

我也尝试过将 UpdateResultsGrid 方法设为静态,但这会引发一些问题,包括使用“this.(anything)”。

我还尝试将大部分 UpdateResultsGrid 方法移到 myOtherClassMethod 中,在 AcquireForm 类中只留下委托。同样,这不起作用,因为对 UI 对象的许多引用都中断了(范围内没有任何 dataGridViews)。

我在这里开始没有想法了。不幸的是,我对 C# 相当陌生(正如您可能知道的那样),而且我正在编辑别人的代码,而不是完全从头开始编写自己的代码。如果有人可以就这个问题提供一些建议,将不胜感激。

4

1 回答 1

0

确保您的对象相互通信:您myOtherClass将必须了解 AcquireForm 对象 - 您不能只是创建一个新对象(正如您所发现的那样)。您需要将 AcquireForm对象传递到 myOtherClass对象(例如 myOtherObject.SetForm(myAcquireForm) 并在需要时引用它。

如果您在调用时遇到问题,这可能会有所帮助 - 我如何调用“下一步”按钮单击:

BeginInvoke(new Action(()=>button_next_Click(null,null)));

此外,听起来这可能不应该是单独的类,而您应该使用BackgroundWorkder

于 2013-09-27T16:07:40.007 回答