如何从另一个类访问表单的方法,确保它是相同的Form实例 - C#

时间:2013-02-05 11:55:51

标签: c# winforms class datagridview static

更新以更清晰....

我有一个主要表单Form1和另一个类AslLibForm1包含一种更新其中包含的dataGridView控件的方法。 AslLib中的方法调用此方法。

我的问题是,AslLib调用Form1方法的唯一方法是在Form1的调用方法中创建AslLib的实例,就像这样:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    public void updateDataGUI(int row, string url, string status, long time)
    {
        Console.WriteLine(status);
        foreach (DataGridViewRow dgvr in dataGridView1.Rows) dgvr.Cells[0].Value = status;
    }

}



static class AslLib
{
    public static async void makeRequest(string url, int row )
    {
        string result;
        Stopwatch sw = new Stopwatch(); sw.Start();

        try
        {
            using (HttpClient client = new HttpClient())
            {
                HttpResponseMessage response = new HttpResponseMessage();
                response = await client.GetAsync(url);

                if (response.IsSuccessStatusCode)
                {
                    result = ((int)response.StatusCode).ToString();
                }
                else
                {
                    result = ((int)response.StatusCode).ToString();
                }
            }
        }
        catch (HttpRequestException hre)
        {
            result = "Server unreachable";
        }

        sw.Stop();
        long time = sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L));


        _form.updateDataGUI(row, url, result, time);

    }
}

我尝试在构造函数和方法中传递参数,但因为(我认为makeRequest方法是静态的,编译器会给出错误:

AsyncURLChecker.AslLib._form: cannot declare instance members in a static class              AsyncURLChecker
Static classes cannot have instance constructors                AsyncURLChecker

上述结果是Console.WriteLine(status);方法的Form1部分正确输出status,但dataGridView不会改变。

我的信念是,因为我正在创建Form1的新实例,所以我不再引用包含我的Form1的原始dataGridView,而是一个全新的副本,所以它是不要改变。

任何人都可以告诉我如何从另一个类操纵原始Form1的dataGridView吗?我首选的方法是调用更新Form1的{​​{1}}方法,而不是直接从dataGridView访问dataGridGiew

4 个答案:

答案 0 :(得分:3)

您应该传递对现有表单的引用,而不是创建新表单:

// on Form1
Class1 c1 = new Class1();
c1.DoSomething(this);

// Class1
public void DoSomething(Form1 form)
{
    form.updateDataGUI(row, url, result, time);
}

答案 1 :(得分:2)

将表单传递给类构造函数

private Form1 _form;
public Class1(Form1 form)
{
    _form = form;
}

您现在可以在班级内访问该表单。

答案 2 :(得分:1)

您需要拥有MainForm的原始创建实例。您可以通过以下方式访问它:

Application.OpenForms.OfType<MainForm>().First().updateDataGUI(row, url, result, time);

Application.OpenForms包含当前正在运行的应用程序的所有打开表单。)

但最好重新设计类结构,以便将MainForm对象的引用传递给类。另一种选择是将实例保存在MainForm本身的静态属性中(如果您确定任何时候只存在一个实例)。

答案 3 :(得分:1)

我认为你可以使用它。

MainForm f = (MainForm)this.Owner;
f.updateDataGUI(row, url, result, time);