如果数组元素与文本框匹配,则更新文件的行

Updating line of a file if array element matches text box

我有一种方法当前读取目录文件的所有行(每行 3 个字段),如果输入的扩展代码与文件中的扩展代码字段匹配,则用文本框条目的记录更新目录数组。

我将更新的目录数组显示为列表视图,当我尝试用更新的数组更新目录文件时,一切都变得糟糕了!编辑澄清:使用下面最新版本的代码,数组不再显示到列表视图,文件也没有更新。没有抛出任何错误。

public void updateName()
    {
        int count = 0;
        string[] lines = File.ReadAllLines(directoryFile);

        // Set size of directory array equal to number of lines in file
        int lineCount = lineCounter();
        directory = new record[lineCount];

        record currentRecord = new record();

        // Iterate through each line in file
        foreach (string line in lines)
        {
            // Split current line into three fields
            string[] fields = line.Split(',');

            // Save current line as new record with surname, forename and extCode fields
            currentRecord.surname = fields[0];
            currentRecord.forename = fields[1];
            currentRecord.extCode = Convert.ToInt32(fields[2]);

            // If extension code in current record matches text box entry
            if (Convert.ToInt32(fields[2]) == Convert.ToInt32(txtExtCode.Text))
            {
                // Change surname and forname fields to match text box entries
                currentRecord.surname = txtForename.Text;
                currentRecord.forename = txtSurname.Text;

                using (StreamWriter writer = new StreamWriter(directoryFile))
                {
                    for (int currentLine = 1; currentLine <= lines.Length; ++currentLine)
                    {
                        if (currentLine == count)
                            writer.WriteLine(currentRecord);
                        else
                            writer.WriteLine(lines[currentLine - 1]);
                    }
                }
            }

            // Save currentRecord as next element in directory array, then increment
            directory[count] = currentRecord;
            count++;
        }
    }

您不需要 linecounter()。行数为lines.Length。 但是为什么需要这个 directory 数组呢?你正在填充它,但你没有在任何地方使用它。

另一个主要问题是您在 foreach 循环中创建了一个 StreamWriter。您应该在循环之前打开文件并在循环之后关闭它以使其工作。 此外,您正在混合写入类型为 recordcurrentRecord 和将字符串类型的行写入输出文件。这行不通。

您还将 txtForename.Text 放入 currentRecord.surname 而不是 currentRecord.forename,反之亦然。

我建议首先在 lines 数组中应用更改,然后使用 File.WriteAllLines 将此 lines 数组写回文件,这是对 [=24 的对称操作=].

我将更改直接应用于 fields 数组,以便我可以将其转换回具有 String.Join 的字符串(这是对 String.Split 的对称操作)。

public void updateName()
{
    // Do this conversion before the loop. We need to do it only once.
    int selectedCode = Convert.ToInt32(txtExtCode.Text);

    string[] lines = File.ReadAllLines(directoryFile);
    for (int i = 0; i < lines.Length; i++)
    {
        // Split current line into three fields
        string[] fields = lines[i].Split(',');

        int extCode = Convert.ToInt32(fields[2]);
        if (extCode == selectedCode)
        {
            fields[0] = txtSurname.Text;
            fields[1] = txtForename.Text;
            lines[i] = String.Join(",", fields);

            // If the extension code is unique, leave the for-loop
            break;
        }
    }
    File.WriteAllLines(directoryFile, lines);
}

我还使用 for 而不是 foreach 以获得索引 i,这样我就可以在 lines 数组中替换一行具体指数.

不知道目录文件中的扩展代码是否唯一。如果是,您可以使用 break.

提前退出 for 循环