我正在尝试编写一个可以显示sql数据库的程序。我有2个表单,我想调用可显示的方法(在主窗体(Form1)上为Form1上的每个选定的表打开一个新的tabpage)。这两个窗体同时打开,第二个窗体应该在调用displaytable方法后关闭(From2)。
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(不起作用):
}
我不知道如何在Form1上调用displaytable方法。
答案 0 :(得分: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
使用Form2
关键字将其当前实例传递给this
。
我还注意到Form2.selectedtabscount
存在同样的问题。如果您向方法displaytable
public void displaytable(int selectedtabscount)
{
for (int i = 0; i < selectedtabscount; i++) {
...
}
}
然后像这样调用它:
_form1.displaytable(checkedListBox1.CheckedItems.Count);
答案 1 :(得分:0)
您只是在创建Form1
的新实例。您没有展示它,您需要致电form1.Show ()
或form1.ShowDialog()
以显示其他表单。
答案 2 :(得分:0)
这个问题与此问题几乎相同:I need to access a form control from another class (C#)
您有两种选择:
bt_select_Click
方法