使用BeginInvoke将数据传递到Winforms UI

时间:2010-04-28 23:51:14

标签: c# winforms

我是C#newbie,并且有一个类需要将行信息传递给windows窗体中的网格。最好的方法是什么?我已经提供了一些示例代码以便更好地理解。

public class GUIController
{   
    private My_Main myWindow;


    public GUIController( My_Main window )
    {
        myWindow = window;
    }

    public void UpdateProducts( List<myProduct> newList )
    {
        object[] row = new object[3];

        foreach (myProduct product in newList)
        {
            row[0] = product.Name;
            row[1] = product.Status;
            row[2] = product.Day;

            //HOW DO I USE BeginInvoke HERE?
       }
    }
}

下面的表单类:

public class My_Main : Form
{
    //HOW DO I GO ABOUT USING THIS DELEGATE?
    public delegate void ProductDelegate( string[] row );
    public static My_Main theWindow = null;

    static void Main(  )
    {            
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        theWindow = new My_Main();
        Application.Run(theWindow);

    }

    private void My_Main_Load( object sender, EventArgs e )
    {            

        /// Create GUIController and pass the window object
        gui = new GUIController( this );
     }

    public void PopulateGrid( string[] row )
    {
        ProductsGrid.Rows.Add(row);
        ProductsGrid.Update();

    }
}

1 个答案:

答案 0 :(得分:1)

像这样:

myWindow.BeginInvoke(new My_Main.ProductDelegate(myWindow.PopulateGrid), new object[] { row });

但是,如果您的代码在后台线程上运行,则只应使用Invoke / BeginInvoke

如果您的UpdateProducts方法在UI线程上运行,则不需要BeginInvoke;你可以简单地调用方法,如下所示:

myWindow.PopulateGrid(row);

如果你打电话给BeginInvoke,你需要通过在循环内移动row的声明来在每次迭代中创建一个单独的数组实例。