我有一个列表视图,显示邮件 - 发件人,邮件,时间是列。这些消息是从包含从串行端口读入的数据的文本文件中读取的,该文件稍后将被解析并显示在带列的列表视图中。每个列表视图项都有一个复选框,指示哪个(哪些)/要删除的消息。我遇到的问题是我无法将listview项与文本文件内容进行比较。这是代码 -
private void btn_delete_Click(object sender, EventArgs e)
{
try
{
string filedata = File.ReadAllText("C:\\message.txt");
string replacedata="";
DialogResult result1 = MessageBox.Show("Are you sure to delete?", "Confirm Delete", MessageBoxButtons.YesNo);
if (result1.Equals(DialogResult.Yes))
{
for (int i = 0; i < lvwMessages.Items.Count; i++)
{
if (lvwMessages.Items[i].Checked)
{
replacedata = filedata.Replace(lvwMessages.SelectedItems[0] + Environment.NewLine, "");
lvwMessages.Items[i].Remove();
i--;
}
}
File.WriteAllText("C:\\message.text",replacedata);
更新:如果发件人的号码在我的联系人列表中,我的列表视图中作为发件人的第一列将被名称替换。所以我无法将完整的选定行与文件中的文本进行比较,因为文件中的该行文本将包含数字而不是名称。
请帮忙。
答案 0 :(得分:1)
您可以通过File.ReadAllLines读取文本文件中的所有行,它将为您提供一个数组(http://msdn.microsoft.com/ru-ru/library/system.io.file.readalllines.aspx)。 然后你可以从中删除单个条目,如下所示:
List<string> lines = File.ReadAllLines("C:\\message.txt").ToList();
foreach (ListViewItem selectedItem in lvwMessages.SelectedItems)
if (lines.Contains(selectedItem.Text))
lines.Remove(selectedItem.Text);
你得到了例外,因为你的列表视图中没有任何选定的项目
答案 1 :(得分:0)
从其余列中提取数据并清空该行:
DialogResult result1 = MessageBox.Show("Are you sure to delete?", "Confirm Delete", MessageBoxButtons.YesNo);
if (result1.Equals(DialogResult.Yes))
{
string re1 = "";
string re2 = "";
string replacedata = filedata;
for (int i = 0; i < lvwMessages.Items.Count; i++)
{
if (lvwMessages.Items[i].Checked)
{
re1 = lvwMessages.CheckedItems[0].SubItems[1].Text;
re2 = lvwMessages.CheckedItems[0].SubItems[2].Text;
replacedata = replacedata.Replace(re1 + re2, "");
lvwMessages.Items[i].Remove();
i--;
}
}
StreamWriter sw = new StreamWriter("C:\\message.txt");
sw.Write(replacedata);
sw.Close();
}