我正在使用c#中的程序,该程序在其主窗体中使用列表框作为选择方法。它具有可以编辑列表框中项目的功能。
我想从单独的专用表单中编辑项目,所以我创建了一个新的表单实例,但每当我尝试访问原始表单的函数(我已公开)时,我收到此错误: 错误2非静态字段,方法或属性
需要对象引用我在互联网上看了很多,但我看到的只是人们谈论在我的功能上使用静态属性。但是,当我这样做时,我会在函数
中弹出更多关于变量等的错误这是Form1中的函数(我试图参考)
public void ReadConfig(string configFile)
{
fileList.Clear();
listBoxName.Items.Clear();
FileStream file = null;
if (!File.Exists(file))
{
MessageBox.Show(file + " was not found: Creating blank file");
using (file = File.Create(file)) ;
}
else
{
string line;
int lineNumber = 1;
// I cut out some long code here where the program reads from a file and saves it to an object
}
}
这是发生错误的代码片段(我剪切了一些代码,我将其保存到文本文件中,但主要关注的部分是Form1.ReadFile(Form1.file)
private void buttonSave_Click(object sender, EventArgs e)
{
string[] temp = File.ReadAllLines(Form1.file);
string[] newFile;
if (itemNew == true)
{
newFile = new string[temp.Length + 1];
}
else
{
newFile = new string[temp.Length];
}
for (int i = 0; i < temp.Length; i++)
{
newFile[i] = temp[i];
}
File.WriteAllLines(Form1.file, newFile);
ConfigForm.ReadFile(Form1.file);
this.Close();
}
我希望有足够的代码可以使用。我的程序很长,所以我尽量保持简短直接。感谢您对我耐心=]
我对编程非常陌生,所以如果有任何善意的人可以帮助你保持尽可能简单吗?
非常感谢=]
答案 0 :(得分:1)
这可能是因为你试图使用第二个窗口中存在的函数,就好像它们是静态的一样,但它们不是。
您可以尝试以这种方式解决此问题:
在第二个表单中创建一个包含第一个表单类的属性,如:
class Form1 : Form
{
//this property will store reference to the first form
public Form1 AssociatedFirstForm { get; set; }
//...
}
然后在您创建第二个表单
...
Form2 secondForm = new Form2();
secondForm.AssociatedFirstForm = this;
...
或者像这样(如果你从代码的另一部分创建两个表单):
...
Form1 firstForm = new Form1();
Form2 secondForm = new Form2();
secondForm.AssociatedFirstForm = firstForm;
...
然后,在您的第二个表单中,您应该可以从第一个表单中调用方法,如下所示:
...
var myResultFromAnotherWindow = this.AssociatedFirstForm.SampleMethodToCall();
...
我想您还应该阅读有关使用static classes and class members和creating instances of objects的更多信息。它应该告诉你如何以及何时使用它们。
<强>更新强>
我还没有写清楚,但如果不是真的需要,你应该避免将公开方法或属性设置为公开。
如果您想在应用程序中创建良好的代码结构并了解它应该如何完成,请查找一些有关面向对象编程的文章。
一些示例链接:
了解 事件机制 也很有用:http://msdn.microsoft.com/en-us/library/awbftdfh.aspx。
答案 1 :(得分:0)
您正在调用类型上的方法而不是类型的实例。当方法未声明为static时,您需要首先实例化包含这些方法的对象(使用new)。
答案 2 :(得分:0)
这是您想要实现的基本想法。更高级的方法是使用委托/事件处理程序,但希望现在保持简单。
表格1
public Form1()
{
InitializeComponent();
}
List<string> _items = new List<string>();
public void LoadListBoxWithItems()
{
for (int i = 0; i < 5; i++)
{
_items.Add(string.Format("My New Item {0}", i));
}
lbItems.DataSource = _items;
lbItems.Refresh();
}
private void btnUpdate_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.LoadValues(lbItems.SelectedItem.ToString(), this);
form2.ShowDialog();
}
public string GetCurrentItem()
{
return lbItems.SelectedItem.ToString();
}
public void UpdateItem(string item, string newitem)
{
int index = _items.IndexOf(item);
_items[index] = newitem;
lbItems.Refresh();
}
表格2
public Form2()
{
InitializeComponent();
}
private string _originalvalue = null;
private Form1 _form1;
public void LoadValues(string item, Form1 form)
{
_originalvalue = item;
_form1 = form;
}
private void btnSave_Click(object sender, EventArgs e)
{
// Do work to change value
string newvalue = _originalvalue;
_form1.UpdateItem(newvalue, _originalvalue);
}