【问题标题】:Background worker not working后台工作人员不工作
【发布时间】:2011-10-19 07:23:24
【问题描述】:

我有一种形式调用另一种形式的方法。但是另一种形式的方法不能正常工作。
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;
            }
        }

【问题讨论】:

  • 请不要在您的问题标题前加上“C# |”。为此,我们在Stack Overflow 上使用标签。
  • BackgroundWorker 的代码在哪里?另外,哪个表格有DataGrid?我们需要更多信息。
  • @MichaelMinton 好的,我已经添加了 backgroundworker 代码,主窗体有数据网格。

标签: c# backgroundworker external-methods


【解决方案1】:

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

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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2014-04-14
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    相关资源
    最近更新 更多