C#从一个函数修改在另一个函数中创建的对象
我试图在程序运行时创建一个列表,我已经在createList()函数中创建了该列表并调用了该函数;但是,我无法从之后调用的button1\u Click()函数访问列表。 如何从不同的函数访问创建的列表,该函数与创建列表时使用的函数不同 代码摘录:C#从一个函数修改在另一个函数中创建的对象,c#,forms,C#,Forms,我试图在程序运行时创建一个列表,我已经在createList()函数中创建了该列表并调用了该函数;但是,我无法从之后调用的button1\u Click()函数访问列表。 如何从不同的函数访问创建的列表,该函数与创建列表时使用的函数不同 代码摘录: public void createlist() { ListView MainList = new ListView(); DisplayPanel.Controls.Add(M
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
中找到它,或者将其设置为类级别字段。您需要学习的概念被称为.scopeMainList
到您的类,或者使用DisplayPanel.Controls
获取对它的引用。这是解决它的一种方法-您也可以在DisplayPanel.Controls
集合中找到它。谢谢,“我该如何把它变成一个类变量呢?”WillAnderson,为了让你学习,一些研究会很好地为你服务,而不是我告诉你怎么做。或者看看菲什福德的答案。另外,您是否正在尝试使用VisualStudio编写用户界面的代码来构建用户界面?如果是这样,您可能想考虑使用VisualStudio的窗体构建设计器。@ SAR1Er80。我使用表单设计器,我只是没有张贴整个代码,因为我觉得它会使问题变得不必要的长。谢谢您的帮助:)@WillAnderson,既然您正在使用表单设计器,那么表单上是否已经有了ListView?如果是这样的话,它已经有了一个变量名,您可以通过它在类中的任何函数中进行访问;进入包含所有函数的主类,程序运行,但单击按钮时发生错误:RCPYC Membership program.exe中发生“System.NullReferenceException”类型的未处理异常。其他信息:对象引用未设置为对象的实例。已编辑我的答案。我猜是因为MainList最初并没有设置为任何值,所以它就消失了。