2011-10-18 251 views
3

我有一种形式调用另一种形式的方法。但其他形式的方法无法正常工作。
窗体2调用main:后台工作不工作

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

主:(增加一行到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; 
      } 
     } 
+1

请不要使用前缀与你的问题标题“ C#|“。我们在[so]上使用了标签。 –

+1

“BackgroundWorker”的代码在哪里?另外,哪个表单有'DataGrid'?我们需要更多信息。 –

+0

@MichaelMinton好的我已经添加了backgroundworker代码,主窗体有数据网格。 – funerr

回答

2

你的问题是从你的按钮点击方法创建一个,单独的主要形式,并不会与你所期望的一个互动的事实而产生。由于一旦按钮点击完成后,您的新表单不再被引用,后台工作人员可能永远不会有机会启动。您需要设置并持有对主窗体的引用才能使用它。

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