如何使用从文本文件中读取的项目填充列表框

How do you populate a ListBox with items read from a text file

所以我尝试读取文件并确认它有效,然后尝试将内容添加到列表框,但没有成功。我这样做的方法是首先读取文件,逐行拆分文件并将内容放入字符串数组,然后使用 for 循环将内容添加到列表框。起初我的问题是列表框没有添加内容,然后发生了一些变化,现在看起来文件没有被正确读取。我不知道它是否会影响任何东西,但我确实在 Visual Studio 中编辑了文件,所以我认为这不会影响任何东西,但我提到它是为了以防万一。我也不止一次地使用 holdLine,因为我正在阅读多个文件。

这是我正在阅读文件的地方


using (StreamReader inOFile = new StreamReader("..\..\options.txt"))
{               
    while (!inOFile.EndOfStream)
    {
        holdLine = inOFile.ReadLine();
        OptionsArr = holdLine.Split('\n');  
    }

有问题的文件有这些行

我尝试将字符串数组的内容添加到列表框的代码

OptionsListBox.Items.Clear();

OptionsListBox.BeginUpdate();
           
//one way I tried            
string listOptions = string.Join(" ", Program.OptionsArr);
OptionsListBox.Items.Add(listOptions.ToString());
              
//different way i tried
for (int i = 0; i < Program.OptionsArr.Length; i++)
{                 
    OptionsListBox.Items.Add(Program.OptionsArr[i]);
}
                  

//another failed attempt
OptionsListBox.Items.AddRange(Program.OptionsArr);

OptionsListBox.EndUpdate();

试试这样的东西:

// Employee is a class with employee fields (EmployeeID, name...)
IList<Employee> employees = readEmployeesFromFile();
OptionsListBox.DataSource = employees;
OptionsListBox.DisplayMember = "Name";
OptionsListBox.ValueMember = "EmployeeID";

下面是一些演示问题的代码。我添加了一些 Console.WriteLine() 来打印出循环期间和之后变量中的内容。 (这里有一个fiddle

using System;
using System.IO;
                    
public class Program
{
    const string _textFile = "This is the first line in the file\n"
                           + "This is the second line in the file\n"
                           + "This is the third line in the file\n";
    public static void Main()
    {
        var utf8 = System.Text.Encoding.UTF8.GetBytes(_textFile);
        var memoryStream = new MemoryStream(utf8);
        memoryStream.Position = 0;
        
        string wholeLine;
        string[] optionsArray;

        using (var inOFile = new StreamReader(memoryStream))
        {           
            var count = 0;
            while (!inOFile.EndOfStream)
            {
                wholeLine = inOFile.ReadLine();
                optionsArray = wholeLine.Split('\n');
                
                Console.WriteLine("Reading Line {0}", ++count);
                Console.WriteLine("\tWhole: '{0}'", wholeLine);
                Console.WriteLine("\tSplit: '{0}'", string.Join("', '", optionsArray));
                Console.WriteLine()
            }
            Console.WriteLine("Final Options Array: {0}", string.Join(" | ", optionsArray));
        }
    }
}

这个程序的输出是:

Reading Line 1
    Whole: 'This is the first line in the file'
    Split: 'This is the first line in the file'

Reading Line 2
    Whole: 'This is the second line in the file'
    Split: 'This is the second line in the file'

Reading Line 3
    Whole: 'This is the third line in the file'
    Split: 'This is the third line in the file'

Final Options Array: This is the third line in the file

注意到 optionsArray 中只包含一项吗?它是 wholeLine 的精确副本吗?那是因为 ReadLine() 函数删除了数据中的所有换行符。 .Split('\n') 将无法拆分任何内容。

如果我将拆分字符更改为 space,那么我会得到:

Reading Line 1
    Whole: 'This is the first line in the file'
    Split: 'This', 'is', 'the', 'first', 'line', 'in', 'the', 'file'

Reading Line 2
    Whole: 'This is the second line in the file'
    Split: 'This', 'is', 'the', 'second', 'line', 'in', 'the', 'file'

Reading Line 3
    Whole: 'This is the third line in the file'
    Split: 'This', 'is', 'the', 'third', 'line', 'in', 'the', 'file'

Final Options Array: This | is | the | third | line | in | the | file

在这种情况下,每一行都被拆分成单独的单词,因为它们由 space ' ' 分隔。但即使我更改拆分,optionsArray 也只包含文件中的 last 行。您的 while 循环被编写为读取整个文件,但由于您从未 执行 任何操作来收集拆分操作的结果,因此您的其余代码将不会执行任何操作。