从其他表单访问功能

时间:2012-04-23 18:44:47

标签: c# winforms

我正在使用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();
    }

我希望有足够的代码可以使用。我的程序很长,所以我尽量保持简短直接。感谢您对我耐心=]

我对编程非常陌生,所以如果有任何善意的人可以帮助你保持尽可能简单吗?

非常感谢=]

3 个答案:

答案 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 memberscreating 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);
    }