C#从一个函数修改在另一个函数中创建的对象

C#从一个函数修改在另一个函数中创建的对象,c#,forms,C#,Forms,我试图在程序运行时创建一个列表,我已经在createList()函数中创建了该列表并调用了该函数;但是,我无法从之后调用的button1\u Click()函数访问列表。 如何从不同的函数访问创建的列表,该函数与创建列表时使用的函数不同 代码摘录: public void createlist() { ListView MainList = new ListView(); DisplayPanel.Controls.Add(M

我试图在程序运行时创建一个列表,我已经在createList()函数中创建了该列表并调用了该函数;但是,我无法从之后调用的button1\u Click()函数访问列表。 如何从不同的函数访问创建的列表,该函数与创建列表时使用的函数不同

代码摘录:

 public void createlist()
        {

            ListView MainList = new ListView();

            DisplayPanel.Controls.Add(MainList);

            MainList.View = View.Details;
            MainList.GridLines = true;

            MainList.Name = "MainList";
            MainList.Size = DisplayPanel.Size;
            int s1 = DisplayPanel.Size.Height;
            int s2 = DisplayPanel.Size.Width;
            MainList.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left | AnchorStyles.Top);

            MainList.Columns.Add("ProductName", 100);
            MainList.Columns.Add("ProductName2", 100);
            MainList.Columns.Add("ProductName3", 100);
            MainList.Columns.Add("ProductName4", 100);

        }

private void button1_Click(object sender, EventArgs e)
        {

            createlist();   //Calls function and creates the ListView

            ListViewItem Source = new ListViewItem("Source", 0);
            Source.Checked = true;
            Source.SubItems.Add("7");
            Source.SubItems.Add("8");
            Source.SubItems.Add("9");

            MainList.Items.AddRange(new ListViewItem[] {Source});

        }
错误:
错误CS0103当前上下文中不存在createList()函数中的名称“MainList”,它只是该函数的局部变量,只能在该函数中使用。为了能够在其他函数中访问它,您需要将其设置为类变量。

您需要将其设置为类的成员,以便从其他函数中访问它。见下文:

class Foo{
    ListView MainList = new ListView();
    public void createlist()
        {

            MainList = new ListView();

            DisplayPanel.Controls.Add(MainList);

            MainList.View = View.Details;
            MainList.GridLines = true;

            MainList.Name = "MainList";
            MainList.Size = DisplayPanel.Size;
            int s1 = DisplayPanel.Size.Height;
            int s2 = DisplayPanel.Size.Width;
            MainList.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left | AnchorStyles.Top);

            MainList.Columns.Add("ProductName", 100);
            MainList.Columns.Add("ProductName2", 100);
            MainList.Columns.Add("ProductName3", 100);
            MainList.Columns.Add("ProductName4", 100);

        }

private void button1_Click(object sender, EventArgs e)
        {

            createlist();   //Calls function and creates the ListView

            ListViewItem Source = new ListViewItem("Source", 0);
            Source.Checked = true;
            Source.SubItems.Add("7");
            Source.SubItems.Add("8");
            Source.SubItems.Add("9");

            MainList.Items.AddRange(new ListViewItem[] {Source});

        }
}

出现此错误的原因是
MainList
不在
按钮1\u单击
方法的范围内

有两种方法可以解决这个问题

  • MainList
    变量置于所有方法之外。这样,
    MainList
    变量就在整个类的范围内,这意味着类中的每个方法都可以访问它

    ListView MainList;
    public void createlist()
    {
        MainList = new ListView();
        DisplayPanel.Controls.Add(MainList);
    
        MainList.View = View.Details;
        MainList.GridLines = true;
    
        MainList.Name = "MainList";
        MainList.Size = DisplayPanel.Size;
        int s1 = DisplayPanel.Size.Height;
        int s2 = DisplayPanel.Size.Width;
        MainList.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left | AnchorStyles.Top);
    
        MainList.Columns.Add("ProductName", 100);
        MainList.Columns.Add("ProductName2", 100);
        MainList.Columns.Add("ProductName3", 100);
        MainList.Columns.Add("ProductName4", 100);
    
    }
    
    // your other method should be here...
    
  • createList
    返回一个值

    public ListView createlist()
    {
        MainList = new ListView();
        DisplayPanel.Controls.Add(MainList);
    
        MainList.View = View.Details;
        MainList.GridLines = true;
    
        MainList.Name = "MainList";
        MainList.Size = DisplayPanel.Size;
        int s1 = DisplayPanel.Size.Height;
        int s2 = DisplayPanel.Size.Width;
        MainList.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left | AnchorStyles.Top);
    
        MainList.Columns.Add("ProductName", 100);
        MainList.Columns.Add("ProductName2", 100);
        MainList.Columns.Add("ProductName3", 100);
        MainList.Columns.Add("ProductName4", 100);
        return MainList;
    }
    
    private void button1_Click(object sender, EventArgs e)
        {
    
            var listView = createlist();   //Calls function and creates the ListView
    
            ListViewItem Source = new ListViewItem("Source", 0);
            Source.Checked = true;
            Source.SubItems.Add("7");
            Source.SubItems.Add("8");
            Source.SubItems.Add("9");
    
            listView.Items.AddRange(new ListViewItem[] {Source});
    
        }
    

  • 我推荐第一种解决方案,因为它允许类中的所有方法访问您可能需要的
    MainList
    。如果您绝对确定不想用任何其他方法访问
    MainList
    ,请使用第二种解决方案。

    您有一个编译错误,因为
    MainList
    仅在
    createlist
    中有效(顺便说一句:编译错误很容易修复。只需阅读一些c文档即可)您可以在
    DisplayPanel.Controls
    中找到它,或者将其设置为类级别字段。您需要学习的概念被称为.scope
    MainList
    到您的类,或者使用
    DisplayPanel.Controls
    获取对它的引用。这是解决它的一种方法-您也可以在
    DisplayPanel.Controls
    集合中找到它。谢谢,“我该如何把它变成一个类变量呢?”WillAnderson,为了让你学习,一些研究会很好地为你服务,而不是我告诉你怎么做。或者看看菲什福德的答案。另外,您是否正在尝试使用VisualStudio编写用户界面的代码来构建用户界面?如果是这样,您可能想考虑使用VisualStudio的窗体构建设计器。@ SAR1Er80。我使用表单设计器,我只是没有张贴整个代码,因为我觉得它会使问题变得不必要的长。谢谢您的帮助:)@WillAnderson,既然您正在使用表单设计器,那么表单上是否已经有了ListView?如果是这样的话,它已经有了一个变量名,您可以通过它在类中的任何函数中进行访问;进入包含所有函数的主类,程序运行,但单击按钮时发生错误:RCPYC Membership program.exe中发生“System.NullReferenceException”类型的未处理异常。其他信息:对象引用未设置为对象的实例。已编辑我的答案。我猜是因为MainList最初并没有设置为任何值,所以它就消失了。