0

假设我有一个包含内容的文件contacts.txt

adam
adam@gmail.com
kris
kris@gmail.com
james
james@gmail.com

我还将文件的内容存储在 ListView (ListView1) 中,例如:

adam    adam@gmail.com
kris    kris@gmail.com
james   james@gmail.com

我已经将 contextmenustrip 与项目更新一起使用。

在 ListView 上说,我右键单击 james 行并选择更新,然后将加载一个新表单,询问姓名和电子邮件以进行更新。

在文本框中输入姓名和电子邮件并在更新按钮后单击相应的人员姓名和电子邮件必须在contacts.txt文件中更新,该表格将被关闭并返回到以前的表格。

假设我将詹姆斯的名字更改为bond 并发送电子邮件至bond@gmail.com。

现在内容应该是:

adam
adam@gmail.com
kris
kris@gmail.com
bond 
bond@gmail.com

同样在右键单击更新时,将加载新表单,提示输入此实例的名称和电子邮件。假设我单击 ListView 中的 james 行,我希望将 james 放在名称上,并将 james@gmail.com 放在电子邮件上的新表单单击 updatemenustrip 的文本框中。

4

2 回答 2

1

有几种方法可以做到这一点。这里有几个。我会用你的例子...

  1. 读取内存中文件的所有行(例如。string[])。对于数组中的每一行,如果找到james,请将其替换为bond,并在下一个位置写入bond@gmail.com。然后将所有行写回同一个文件

    var lines = File.ReadAllLines(@"C:\test.txt");
    
    for (int i = 0; i < lines.Length; i++) {
        var line = lines[i];
        if (line == "james") {
            lines[i] = "bond";
            lines[i + 1] = "bond@gmail.com";
        }
    }
    
    File.WriteAllLines(@"C:\test2.txt", lines);
    
  2. 阅读整个文本,并使用正则表达式替换这些特定值:

    var text = File.ReadAllText(@"C:\test.txt");
    
    string oldName = "james";
    string newName = "bond";
    string oldEmail = "james@gmail.com";
    string newEmail = "bond@gmail.com";
    
    var newText = Regex.Replace(
        text,
        string.Format(@"{0}([\n\r]+){1}", Regex.Escape(oldName), Regex.Escape(oldEmail)),
        string.Format(@"{0}$1{1}", newName, newEmail));
    
    File.WriteAllText(@"C:\test.txt", newText);
    
于 2013-03-02T05:13:34.477 回答
0

更新后,ListView.items是最新的。迭代ListView.items并将每个项目写回文件。

于 2013-03-02T05:15:22.690 回答