【问题标题】:Reading content of sundry text files in a WPF C# application在 WPF C# 应用程序中读取各种文本文件的内容
【发布时间】:2014-02-26 22:04:34
【问题描述】:

编辑: 我正在尝试在 WPF C# 应用程序中读取各种(在本例中为 7)文本文件的内容。因此,我使用以下代码,已被编辑:

try
        {
            List<string> Verknüpfung = new List<string>();

            foreach (string Datei in Directory.GetFiles(V.PfadShortcuts, "*.txt"))
            {
                Verknüpfung.AddRange(File.ReadAllLines(Datei, Encoding.UTF8));
            }

            for (int i = 0; i <= Verknüpfung.Count - 1; i += 2)
            {
                Image Icon = new Image();
                Icon.Source = new BitmapImage(new Uri(@"Images\Fugue Icons\document.png", UriKind.Relative));
                Icon.Height = 16;
                Icon.Width = 16;
                Icon.Stretch = Stretch.None;

                MenuItem MenuItem = new MenuItem();
                MenuItem.Click += delegate { Process.Start(Verknüpfung[1 + i]); };
                MenuItem.Header = Verknüpfung[0 + i];
                MenuItem.Icon = Icon;
                MenuItem.Padding = new Thickness(5);

                MI_Verknüpfungen.Items.Add(MenuItem);
            }
        }

我有 7 个文本文件。每个都包含以下内容:第 1 行:标题(如“Google”;对于 HEADER)和第 2 行:流程(如“https://www.google.de/”;对于 CLICK EVENT)。

但是,我得到了这个结果(抱歉隐藏信息,但它包含业务事项):

所以它似乎工作。但不幸的是,当我单击其中一个时,我收到以下错误消息:

德语:“Der Index lag außerhalb des Bereichs。Er muss nicht negativ und kleiner als die Auflistung sein。参数名称:index”

英文:“索引超出范围。必须为非负数且小于集合的大小。参数名称:索引”

当我更改以下内容时,它可以工作:

之前:MenuItem.Click += delegate { Process.Start(Verknüpfung[1 + i]); };

之后:MenuItem.Click += new RoutedEventHandler(MenuItem_Click);

public void MenuItem_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 0; i <= Verknüpfung.Count - 1; i += 2)
        {
            Process.Start(Verknüpfung[1 + i]);
        }
    }

但是现在,当我单击其中一个菜单项时,应用程序会运行所有进程(即保存在我的集合中的所有 7 个“快捷方式”) - 但是,错误消息消失了。 如何管理只运行被点击的进程?

【问题讨论】:

    标签: c# wpf list collections parameters


    【解决方案1】:

    好吧,让我们分析一下你的问题......你说:

    当我单击 [MenuItems] 之一时,我收到以下错误消息:

    “索引超出范围。必须为非负数且小于集合的大小。参数名称:索引”

    所以当您点击MenuItem 时遇到问题...让我们看看您声明在点击MenuItem 时应该发生什么:

    MenuItem.Click += delegate { Process.Start(Verknüpfung[0 + i]); };
    

    宾果!有你的index 参数,你正在传递值0 + i。不过我很好奇...为什么0 + ii 一样?但无论如何,i 等于什么?:

    foreach (string Datei in Directory.GetFiles(V.PfadShortcuts, "*.txt"))
    {
        ...
        i += 2;
    }
    

    那是什么? i += 2 但这意味着对于每个文件,您都在尝试访问Verknüpfung 集合中的位置,该位置是您拥有的文件数量的两倍。现在您没有展示您是如何声明该集合的,但如果它是某种数组,那么我猜i += 2 可能会更好,如果它是i++

    当然,如果您的文件中只有两行,那么这可以解释这一点,但这是我能从您所展示的内容中猜到的最好的。如果这不正确,那么只需在Click 处理程序中放置一个断点并检查i 的值和Verknüpfung 集合中的项目数,然后您就会知道问题所在。

    【讨论】:

    • 非常感谢您的帮助。首先让我评论一下:我说“0+i”是因为我希望应用程序在下一轮创建菜单项时转到下一项。所以,我说 i+=2 在下一轮循环中转到下一个项目之后。集合声明已编辑。此外,我可以说,集合中有 14 项 - 我使用 Verknüpfung.Count 来计算它们。
    【解决方案2】:

    问题已解决! ;) 解决方案是创建一个新的 var (tmp)。

    for (int i = 0; i <= Verknüpfung.Count - 1; i += 2)
                {
                    Image Icon = new Image();
                    Icon.Source = new BitmapImage(new Uri(@"Images\Fugue Icons\document.png", UriKind.Relative));
                    Icon.Height = 16;
                    Icon.Width = 16;
                    Icon.Stretch = Stretch.None;
    
                    var tmp = i;
    
                    MenuItem MenuItem = new MenuItem();
                    MenuItem.Click += delegate { Process.Start(Verknüpfung[1 + tmp]); };
                    MenuItem.Header = Verknüpfung[0 + i];
                    MenuItem.Icon = Icon;
                    MenuItem.Padding = new Thickness(5);
    
                    MI_Verknüpfungen.Items.Add(MenuItem);
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 2018-06-01
      • 2010-10-19
      相关资源
      最近更新 更多