0

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

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

我在编程方面很新,所以如果有任何善良的灵魂碰巧帮助你,你能让它尽可能简单吗?

非常感谢=]

4

3 回答 3

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();
    ...
    

我想您还应该阅读有关使用静态类和类成员以及创建对象实例的更多信息。它应该让您清楚如何以及何时使用它们。

更新

我写得不够清楚,但是如果不是真的需要,您应该避免将公开方法或属性设置为公共。

如果您想在应用程序中创建良好的代码结构并了解应该如何完成,请查找有关面向对象编程的文章。

一些示例链接:

了解事件机制也很有用:http: //msdn.microsoft.com/en-us/library/awbftdfh.aspx

于 2012-04-23T19:18:06.927 回答
0

您正在调用类型而不是类型实例的方法。当方法未声明为静态时,您需要首先实例化包含这些方法的对象(使用 new)。

于 2012-04-23T19:09:35.213 回答
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);
    }
于 2012-04-23T20:17:58.383 回答