2014-12-28 113 views
0

我正試圖編寫一個可以顯示sql數據庫的程序。我有兩種形式,我想要調用displaytable方法(它在sql數據庫中爲每個選定的表格在主窗體(Form1)上打開一個新的tabpage)在Form1上。兩個窗體同時打開,第二個窗體(From2)應該在調用displaytable方法後關閉。從另一種形式調用方法

Form1中:


    private void openDatabaseToolStripMenuItem1_Click(object sender, EventArgs e)//File/Database/Open Database 
     { 
      OpenFileDialog openFileDialog1 = new OpenFileDialog(); 
      if (openFileDialog1.ShowDialog() == DialogResult.OK) 
      { 
       data = openFileDialog1.FileName; 
      } 
      cn = "Provider=Microsoft.JET.OLEDB.4.0; Data Source =" + data; 
      try 
      { 
       connection = new OleDbConnection(cn); 
       connection.Open(); 
       Form2 DataSelect = new Form2(); 
       DataSelect.Show(); 
      } 
      catch (Exception exceptcion) 
      { 
       MessageBox.Show("Such Error! Very Problem: "+exceptcion); 
      } 
     }
public void displaytable() // displays selected table on new tabpage (and dgv) { for (int i = 0; i < Form2.selectedtabscount; i++) { string a = database.ElementAt(i); TabPage page = new TabPage(a); tabControl1.TabPages.Add(page); }

} 

Fomr2(不工作):
 
private void bt_select_Click(object sender, EventArgs e) 
     { 
      selectedtabscount = checkedListBox1.CheckedItems.Count; 
      Form1.displaytable(); 
      this.Close(); 
     } 

我不知道如何調用displaytable方法在Form1上的想法。

+3

又有什麼問題呢? –

+3

如果它「不起作用」,「讓它工作」。如果你想在這裏得到一個好的答案,學會提出一個好問題。錯誤描述是其中的一部分。 – nvoigt

回答

1

Form1.displaytable();不起作用,因爲displaytable是一個實例方法。請記住Form1是一個類,即一個類型。您不能在類型Form1上調用它,而必須在它的一個實例上調用它。

您可以通過構造函數注入將Form1的實例傳遞給Form2。參數添加到的Form2

private Form1 _form1; 

public Form2(Form1 form1) 
{ 
    InitializeComponent(); 
    _form1 = form1; 
} 

private void bt_select_Click(object sender, EventArgs e) 
{ 
    selectedtabscount = checkedListBox1.CheckedItems.Count; 
    _form1.displaytable(); 
    this.Close(); 
} 

構造在Form1您將創建的Form2一個實例是這樣的:

Form2 DataSelect = new Form2(this); 

Form1通過其當前實例Form2this關鍵字。


我還注意到,你有與Form2.selectedtabscount相同的問題。它將使更多的意義,如果你加入一個參數的方法displaytable

public void displaytable(int selectedtabscount) 
{ 
    for (int i = 0; i < selectedtabscount; i++) { 
     ... 
    } 
} 

,然後調用它像這樣:

_form1.displaytable(checkedListBox1.CheckedItems.Count); 
+0

我寧願[events](http://stackoverflow.com/a/27677433/594832),而不是將表單連接得比需要的更緊密。 – khlr

+1

我也是;然而,向初學者解釋這一點並不容易。我甚至會實現一種不依賴於表單的消息系統。這可能只是一個靜態類中的'SelectionChanged(Type entityType)'類型的全局(靜態)事件。 –

+0

沒錯。不容易解釋。 – khlr

0

您剛剛創建Form1的新實例。您沒有顯示,您需要撥打form1.Show()form1.ShowDialog()以顯示其他表格。