所以,我在Form2中有一个树视图。单击按钮,在Form3中执行一个代码,将文本框中的文本(从Form3)插入到数据库中,之后,我希望Form2中的树视图使用数据库中的这些值更新自己,这意味着我需要要么在我在Form3中编写的代码中使用treeView1(来自Form2),要么在Form2中编写一个方法(我已经完成)在Form3中使用。
Form2中的方法:
public static void LoadTree()
{
int j = 1;
string var;
con.Open();
OleDbCommand populate = new OleDbCommand("SELECT Project_name FROM Edit_Nodes ORDER BY Location ASC", con);
OleDbDataReader reader = populate.ExecuteReader();
while (reader.Read())
{
var = "H" + j + " - " + reader["Project_name"] + "";
treeView1.Nodes[j].Text = var;
j++;
}
con.Close();
}
问题:“错误5非静态字段,方法或属性'Tool.Form2.con'需要对象引用,等等,对于treeView1和代码中的其他内容。
Form3中的代码:
private void button1_Click(object sender, EventArgs e)
{
// more code here
Form2.LoadTree();
}
我的问题是如何解决这些错误,或者......我如何直接让程序识别Form3中的treeView1(它属于Form2),所以我可以在那里再次编写代码。
答案 0 :(得分:0)
首先,将其设为实例方法而不是静态方法:
public void LoadTree()
{
// implementation
}
static
不起作用的原因是因为它没有表单的任何给定实例的上下文,因此它没有任何给定实例上的控件的上下文(例如{ {1}})。接下来,您需要treeView1
实例来引用该特定Form3
实例。一种简单的方法是向Form2
添加属性,并在其构造函数中需要引用。所以,在Form3
:
Form3
此时,只要您需要创建private Form2 Form2Instance { get; set; }
public Form3(Form2 form2Instance)
{
this.Form2Instance = form2Instance;
}
的实例,就需要为其提供Form3
的实例。因此,如果您从Form2
内创建它,那么您可以执行以下操作:
Form2
此时var form3Instance = new Form3(this);
form3Instance.Show();
的任何实例都引用了创建它的Form3
实例。因此,Form2
上的代码只能引用它在该私有属性中的实例来调用方法:
Form3
答案 1 :(得分:0)
您的代码存在许多问题,请参阅我的评论
// Since you want to update treeView1 you should
// point out on which instance of Form1 the target treeView1 is.
// That's why LoadTree() can't be static
public void LoadTree() { // <- Not static!
// Much better to use a local connection here
//TODO: provide the right connection string here
using(OleDbConnection con = new OleDbConnection(connectionString)) {
con.Open();
// wrap all local IDisposable into using(...) {...}
using (OleDbCommand populate = new OleDbCommand(con)) {
// Format out your SQL for it to be readble
populate.CommandText =
" select Project_Name\n" +
" from Edit_Nodes\n" +
"order by Location asc";
// wrap all local IDisposable into using(...) {...}
using (OleDbDataReader reader = populate.ExecuteReader()) {
// When updating visual controls prevent them from constant re-painting
// and annoying blinking
treeView1.BeginUpdate();
try {
// What is "j"? No-one knows; "loop" is more readable
int loop = 1;
while(reader.Read()) {
// "var" is unreadable, "nodeText" is clear
String nodeText = "H" + loop.ToString() + " - " + reader["Project_Name"];
// Check ranges: what if SQL returns more recods than treeView1's nodes?
if (loop >= treeView1.Nodes.Count)
break;
treeView1.Nodes[loop].Text = nodeText;
loop += 1;
}
finally {
treeView1.EndUpdate();
}
}
}
}
现在,是时候致电LoadTree()
;但对于哪个 Form2
实例?想象一下,你已经打开了五个 Form2
的。现在让我们为所有LoadTree()
个实例调用Form2
:
private void button1_Click(object sender, EventArgs e) {
// Enumerating all open forms
foreach (Form form in Application.OpenForms) {
Form2 source = form as Form2;
// If the open form is Form2, call LoadTree
if (!Object.ReferenceEquals(null, source))
source.LoadTree();
}
}
答案 2 :(得分:-1)
看起来你在LoadTree()方法中运行了一个名为'treeView1'的东西。如果这是Form2的一部分,它必须是静态的,或者您必须从已经实例化的对象中调用此方法。
Form2 form = new Form2(); form.TreeView();