更新以更清晰....
我有一个主要表单Form1
和另一个类AslLib
。 Form1
包含一种更新其中包含的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
。
答案 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);