如何在c# WinForms中从if语句外部访问if语句内创建的控制?

本文关键字:if 语句 创建 控制 访问 外部 WinForms 中从 | 更新日期: 2023-09-27 18:10:08

我正在将音乐播放列表从磁盘加载到c# ListView控件。我使用ListViewGroups来分离专辑,在播放列表中可以有几个专辑。

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

|album|name of album
track 1 fsdfsfasf.mp3
track 2 fdsgfgfdhhh.mp3
track 3 gfdgsdgsdfgs.mp3

当我将播放列表加载到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);
        }
    }
}

如果"|album|"字符串被找到,那么我创建新的ListViewGroup。但是这个组在else-statement中是不可访问的(我不能将item赋值给group),因为它超出了作用域。我如何在if语句中创建新的ListViewGroup并在if语句之外使用它?

如何在c# WinForms中从if语句外部访问if语句内创建的控制?

需要在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
                    }
                }
            }
        }

您必须首先在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);
        }