Listview, отображающий избыточные данные
У меня есть следующий код, в котором я добавляю данные в представление списка, но в итоге у меня появляются лишние элементы. Пожалуйста, дайте мне знать, где я иду не так
private void button2_Click(object sender, EventArgs e)
{
listView1.Items.Clear();
StreamReader sr = new StreamReader("C:\\sample.txt");
string s;
s = sr.ReadLine();
while (s != null)
{
s = sr.ReadLine();
var m = Regex.Match(s, @"^([a-zA-Z._]+)@([\d]+)");
if(m.Success)
{
allcont ac = new allcont();
ac.name = m.Groups[1].Value;
ac.number = m.Groups[2].Value;
con.Add(ac);
foreach (allcont aa in con)
{
ListViewItem i = new ListViewItem(new string[] { aa.name, aa.number });
i.Tag = aa;
listView1.Items.Add(i);
}
s = sr.ReadLine();
}
}
sr.Close();
}
contacts con = new contacts();
public class contacts:List<allcont>
{
}
public class allcont
{
public string name;
public string number;
}
}
Мой sample.txt имеет это:
wer@123
erty@098
sdf@645
ytu@432
Обновление: это данные, которые показывает мой список:
name number
wer 123
wer 123
erty 098
wer 123
erty 098
sdf 645
wer 123
erty 098
sdf 645
wer 123
erty 098
sdf 645
ytu 432
2 ответа
Решение
Я думаю, вы получите что-то вроде
wer@123
wer@123
erty@098
wer@123
erty@098
sdf@645
wer@123
erty@098
sdf@645
ytu@432
Причина: у вас есть проблема здесь
allcont ac = new allcont();
ac.name = m.Groups[1].Value;
ac.number = m.Groups[2].Value;
con.Add(ac);
foreach (allcont aa in con)
{
ListViewItem i = new ListViewItem(new string[] { aa.name, aa.number });
i.Tag = aa;
listView1.Items.Add(i);
}
потому что вы делаете это в цикле while. (вы добавляете вещи в список con
в каждом цикле, а затем зациклите этот "увеличенный список" внутри цикла while).
Таким образом, вы должны переместить "внутренний цикл"
foreach (allcont aa in con)
{
ListViewItem i = new ListViewItem(new string[] { aa.name, aa.number });
i.Tag = aa;
listView1.Items.Add(i);
}
вне цикла while (после sr.Close
)
con.Add(ac);
foreach (allcont aa in con)
{
ListViewItem i = new ListViewItem(new string[] { aa.name, aa.number });
i.Tag = aa;
listView1.Items.Add(i);
}
вы повторяете полную коллекцию кон
избавиться от внутренней петли
allcont ac = new allcont();
ac.name = m.Groups[1].Value;
ac.number = m.Groups[2].Value;
con.Add(ac);
ListViewItem i = new ListViewItem(new string[] { ac.name, ac.number });
i.Tag = aa;
listView1.Items.Add(i);