0

更新得更清楚了......

我有一个主要形式 ,Form1和一个附加类,AslLibForm1包含一个更新dataGridView它包含的控件的方法。中的一个方法AslLib调用此方法。

我的问题是,我可以AslLib调用 call方法的唯一Form1方法是创建一个Form1inAslLib调用方法的实例,如下所示:

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);部分正确输出,但是没有改变。Form1statusdataGridView

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

谁能告诉我如何dataGridView从另一个班级操纵原始的 Form1?如果可能,我首选的方法是调用一个Form1更新dataGridView而不是直接访问dataGridGiew的方法AslLib

4

4 回答 4

3

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

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

// Class1
public void DoSomething(Form1 form)
{
    form.updateDataGUI(row, url, result, time);
}
于 2013-02-05T11:58:32.223 回答
2

将表单传递给类构造函数

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

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

于 2013-02-05T11:58:29.933 回答
1

您需要拥有原始创建的MainForm. 这是您可以访问它的一种方式:

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

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

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

于 2013-02-05T11:59:27.213 回答
1

我想你可以用这个。

MainForm f = (MainForm)this.Owner;
f.updateDataGUI(row, url, result, time);
于 2013-02-05T12:12:39.267 回答