gpt4 book ai didi

c# - 后台 worker 不工作

转载 作者:行者123 更新时间:2023-11-30 17:15:41 25 4
gpt4 key购买 nike

我有一种形式调用另一种形式的方法。但另一种形式的方法不能正常工作。
Form2 调用 main:

private void button1_Click(object sender, EventArgs e)
{
main ma = new main();
ma.AddType(txtName.Text,txtURL.Text,12);
this.Close();
}

ma​​in:(向 xml 添加一行并从 xml 重新加载数据网格)

public void AddType(string name, string url, int interval)
{

string path = Application.StartupPath + @"\sites.xml";
//create new instance of XmlDocument
XmlDocument doc = new XmlDocument();
//load from file
doc.Load(path);
//create node and add value
XmlNode node = doc.CreateNode(XmlNodeType.Element, "site", null);
node.InnerXml = "<Name>"+name+"</Name><URL>"+url+"</URL><Status></Status><Response-Time></Response-Time><Last-Checked></Last-Checked>";
//add to elements collection
doc.DocumentElement.AppendChild(node);
//save back
doc.Save(path);
bwLoadXML.RunWorkerAsync();
}

bwLoadXML.RunWorkerAsync();出于某种原因未在数据网格中显示新的 xml。

编辑,这是 backgroundWorker:

/////////////////////////////////
////Populate Grid from XML
/////////////////////////////////
private void bwLoadXML_DoWork(object sender, DoWorkEventArgs e)
{
gridPopulate();
}
private void gridPopulate()
{

DataSet data = new DataSet(); string p = System.IO.Path.Combine(Application.StartupPath, "sites.xml");
data.ReadXml(p);
if (this.dataGrid.InvokeRequired)
{
this.dataGrid.Invoke(new MethodInvoker(delegate
{
this.dataGrid.DataSource = data;
this.dataGrid.DataMember = "site";
}));
}
else
{
this.dataGrid.DataSource = data;
this.dataGrid.DataMember = "site";
}
int i = 0;
foreach (DataGridViewColumn column in this.dataGrid.Columns)
{
if (i != 0)
{
if (column.Name == "Name" || column.Name == "Status" || column.Name == "URL" || column.Name == "Response-Time" || column.Name == "Last-Checked")
{
//column.AutoSizeMode
column.Visible = true;
//column.Width = (int)(dataGrid.Width * .2) + (column.Name.Length / 2)-9;
/*if (column.Name == "URL")
{
ColumnHeader ch = new ColumnHeader();
//ch.
}*/
}
else
{
column.Visible = false;
//dataGrid.Columns[i+1].CellType = new DataGridViewButtonColumn();
//dataGrid.Columns[i+1].HeaderCell.
}
}
i++;
}
if (this.dataGrid.InvokeRequired)
{
this.dataGrid.Invoke(new MethodInvoker(delegate
{
// If column 3 is the checkbox column, we sit it's resize mode to none:
dataGrid.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
// Then we set the width:
dataGrid.Columns[0].Width = 25;
dataGrid.Columns[0].DefaultCellStyle.Padding = System.Windows.Forms.Padding.Empty;
// If column 3 is the checkbox column, we sit it's resize mode to none:
dataGrid.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
// Finally we set the rest of the grid to fill or what ever resizing you need:
dataGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}));
}
else
{
// If column 3 is the checkbox column, we sit it's resize mode to none:
dataGrid.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
// Then we set the width:
dataGrid.Columns[0].Width = 25;
dataGrid.Columns[0].DefaultCellStyle.Padding = System.Windows.Forms.Padding.Empty;
// If column 3 is the checkbox column, we sit it's resize mode to none:
dataGrid.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
// Finally we set the rest of the grid to fill or what ever resizing you need:
dataGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}
}

最佳答案

您的问题源于这样一个事实,即您的按钮点击方法创建了一个、单独的主窗体,并且不与您期望的窗体交互。由于单击按钮后不再引用您的新表单,因此后台工作人员可能永远没有机会启动。您需要设置并保留对主窗体的引用才能使用它。

public class Form2 : ... {
main ma;

public Form2(main ma) {
this.ma = ma;
}

private void Button1_Click(object sender, EventArgs e) {
this.ma.AddType(txtName.Text, txtUrl.Text, 12);
this.Close();
}
}

从主窗体开始,当您创建第二个窗体并显示它时,您需要传入它期望的窗体:

void DoingSomething() {
Form2 form = new Form2(this); // <-- this is where you pass in main
form.ShowDialog();
}

关于c# - 后台 worker 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7813212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com