2014-12-28 114 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()以显示其他表格。