如何从C#WinForms中的if语句外部访问在if语句中创建的控件?

如何从C#WinForms中的if语句外部访问在if语句中创建的控件?,c#,winforms,scope,listviewgroup,C#,Winforms,Scope,Listviewgroup,我正在将音乐播放列表从磁盘加载到C#ListView控件。我使用ListViewGroups来分隔相册,并且在播放列表中可以有多个相册 播放列表以以下文本格式保存:(我知道这不是最好的方式,但适用于本例) 当我将播放列表加载到ListView时,我测试是否从行的开头找到字符串“| album |”,并将该行用作组标题文本。代码示例如下: using (StreamReader reader = File.OpenText("playlist.txt")) { while (reader.

我正在将音乐播放列表从磁盘加载到C#ListView控件。我使用ListViewGroups来分隔相册,并且在播放列表中可以有多个相册

播放列表以以下文本格式保存:(我知道这不是最好的方式,但适用于本例)

当我将播放列表加载到ListView时,我测试是否从行的开头找到字符串“| album |”,并将该行用作组标题文本。代码示例如下:

using (StreamReader reader = File.OpenText("playlist.txt"))
{
    while (reader.Peek() >= 0)
    {
        result = reader.ReadLine();

        if (result.Substring(0, 7) == "|album|")
        {
            ListViewGroup group = new ListViewGroup();
            group.Header = result.Substring(7);
            lstPlaylist.Groups.Add(group); // lstPlaylist is existing ListView control for playlist
        }

        else
        {
            ListViewItem item = new ListViewItem(result, 0, group);
            lstPlaylist.Items.Add(item);
        }
    }
}

如果找到“|相册|”字符串,则创建新的ListViewGroup。但在else语句中无法访问该组(我无法将项分配给该组),因为它超出了范围。如何在if语句内部创建新的ListViewGroup,并在if语句外部使用它?

您必须首先在if语句外部声明变量,然后在if语句内部给它任何值。或者,如果希望if和else中的值相同,则在外部

基本上,如果您转到代码的else部分,就永远不会生成变量,因为它是在if部分创建和初始化的


祝你好运

查看您的逻辑,无论哪种情况,您都需要初始化
ListViewGroup
。如果找到单词“| album |”,则还可以指定属性值。因此,一个简单的解决方法是向上移动变量以增加其范围:

ListViewGroup group = new ListViewGroup();//move to here
if (result.Substring(0, 7) == "|album|")
        {

            group.Header = result.Substring(7);
            lstPlaylist.Groups.Add(group); // lstPlaylist is existing ListView control for playlist
        }

        else
        {
            ListViewItem item = new ListViewItem(result, 0, group);//now group is initialized here as well
            lstPlaylist.Items.Add(item);
        }

您需要在if语句之外声明变量,以便它在else子句中可用。除非您已经验证了源文件,否则您还需要处理在相册之前找到曲目的情况

using (StreamReader reader = File.OpenText("playlist.txt"))
        {
            ListViewGroup group = null;
            while (reader.Peek() >= 0)
            {
                result = reader.ReadLine();
                if (result.Substring(0, 7) == "|album|")
                {
                    group = new ListViewGroup();
                    group.Header = result.Substring(7);
                    lstPlaylist.Groups.Add(group); // lstPlaylist is existing ListView control for playlist
                }

                else
                {
                    if (group != null)
                    {
                        ListViewItem item = new ListViewItem(result, 0, group);
                        lstPlaylist.Items.Add(item);
                    } 
                    else
                    {
                        // you are trying to add a track before any group has been created.
                        // handle this error condition
                    }
                }
            }
        }

在外部声明变量。如果您计划在其他方法中使用它,请使用字段。我认为这有一个错误,因为我只得到一个名为“default”的组。但修复很简单,我在while语句之前声明了“ListViewGroup=null;”(不在它内部,所以它不会多次声明),这样就可以了。谢谢你让我走上正轨!
using (StreamReader reader = File.OpenText("playlist.txt"))
        {
            ListViewGroup group = null;
            while (reader.Peek() >= 0)
            {
                result = reader.ReadLine();
                if (result.Substring(0, 7) == "|album|")
                {
                    group = new ListViewGroup();
                    group.Header = result.Substring(7);
                    lstPlaylist.Groups.Add(group); // lstPlaylist is existing ListView control for playlist
                }

                else
                {
                    if (group != null)
                    {
                        ListViewItem item = new ListViewItem(result, 0, group);
                        lstPlaylist.Items.Add(item);
                    } 
                    else
                    {
                        // you are trying to add a track before any group has been created.
                        // handle this error condition
                    }
                }
            }
        }