0

より明確になるように更新されました。

メインフォーム、、Form1および追加のクラス、がありAslLibます。含まれているコントロールForm1を更新するメソッドが含まれています。dataGridViewのメソッドAslLibはこのメソッドを呼び出します。

AslLib私の問題は、のメソッドを呼び出すことができる唯一の方法は、次のようにの呼び出しメソッドのForm1インスタンスを作成することです。Form1AslLib

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元のインスタンスを参照しているのではなく、まったく新しいコピーを参照しているため、変更されていないということです。Form1dataGridView

dataGridView別のクラスの元のForm1を操作する方法を教えてもらえますか?私の好みの方法は、可能であれば直接アクセスするのではなくForm1、更新するメソッドを呼び出すことです。dataGridViewdataGridGiewAslLib

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。アクセスする方法の1つは次のとおりです。

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

Application.OpenForms現在実行中のアプリケーションの開いているフォームがすべて含まれています。)

MainFormただし、オブジェクトの参照をクラスに渡すことができるように、クラス構造を再設計することをお勧めします。もう1つのオプションは、インスタンスをMainFormそれ自体の静的プロパティに保持することです(常に1つのインスタンスのみが存在することが確実な場合)。

于 2013-02-05T11:59:27.213 に答える
1

これなら使えると思います。

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