2011-10-18 249 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(); 
}