我正在开发一个供个人使用的项目(简单的电话簿)。 This is how it looks like:
我有一个充满联系人的列表视图,一切都工作得很好,直到我添加了这行代码,当一切都搞砸了。
listView1.Sorting = SortOrder.Ascending;
所以,问题很明显。假设列表中有6个联系人,联系人1 位于城市1 ,地址1 ,有电话。 城市2 中的<1> [等]和联系人2 ,地址2 ,电话。 No 2 等[...序列继续...]
当我尝试进行一些更改时,例如,联系人5 突然获取其他联系人的信息,在这种情况下,联系人7 。它的信息无关紧要,问题是一切都搞砸了。
此外,如果我想从列表视图中删除所有联系人 - 这是不可能的 - 总会有一个剩余。例如,如果有6个,则删除5个,剩下一个。此外,如果有100个,它将删除99,并且一个也将保持不变。
我发现再也不使用所选项目的索引了,我现在必须使用所选项目的值(而不是索引)。但是,问题是我不知道该怎么做。
也许仅限于listView1_SelectedIndexChanged。请注意,我只是猜测,我不完全确定。
如果是,请输入以下代码:
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count == 0) return;
textBox1.Text = people[listView1.SelectedItems[0].Index].Name;
textBox2.Text = people[listView1.SelectedItems[0].Index].Hometown;
textBox3.Text = people[listView1.SelectedItems[0].Index].Address;
textBox4.Text = people[listView1.SelectedItems[0].Index].Phone;
textBox5.Text = people[listView1.SelectedItems[0].Index].Email;
textBox6.Text = people[listView1.SelectedItems[0].Index].AdditionalInfo;
dateTimePicker1.Value = people[listView1.SelectedItems[0].Index].Birthday;
textBox1.ReadOnly = true;
textBox2.ReadOnly = true;
textBox3.ReadOnly = true;
textBox4.ReadOnly = true;
textBox5.ReadOnly = true;
textBox6.ReadOnly = true;
dateTimePicker1.Enabled = false;
toolStripButton5.Enabled = true;
}
我认为在此处上传代码非常重要,所以I uploaded the code here:
有没有人有解决方案?
答案 0 :(得分:0)
为了找到要更新的正确对象,首先需要在People
集合中找到与ListView
中所选对象匹配的对象。
Person i = People.FirstOrDefault(p => p.Name == ((ListView) sender).SelectedItems[0].Text);
PopulateEditData(i); // refer below for method...
这只有在MultiSelect
属性设置为false时才有效,否则您需要从所选项目的集合中获取正确的项目。
如下所示:http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.selecteditems(v=vs.110).aspx
拥有正确的Person
对象后,您将能够在文本框中检索并显示对象详细信息:
private void PopulateEditData(Person selectedPerson)
{
textBox1.Text = selectedPerson.Name;
textBox2.Text = selectedPerson.Hometown;
textBox3.Text = selectedPerson.Address;
textBox4.Text = selectedPerson.Phone;
textBox5.Text = selectedPerson.Email;
textBox6.Text = selectedPerson.AdditionalInfo;
dateTimePicker1.Value = selectedPerson.Birthday;
textBox1.ReadOnly = true;
textBox2.ReadOnly = true;
textBox3.ReadOnly = true;
textBox4.ReadOnly = true;
textBox5.ReadOnly = true;
textBox6.ReadOnly = true;
dateTimePicker1.Enabled = false;
toolStripButton5.Enabled = true;
}
我还建议将selectPerson
设置为表单的属性或其中一个可用的类,以便在对象上编辑和保存数据更容易。
对于问题的删除部分,请使用SelectedPerson
属性删除项目。
private void button1_Click(object sender, EventArgs e)
{
if (SelectedPerson != null)
{
People.Remove(SelectedPerson);
this.listView1.Items.Clear();
foreach (var person in People)
{
this.listView1.Items.Add(person.ToString());
this.listView1.Sorting = SortOrder.Ascending;
}
this.listView1.Refresh();
this.button1.Enabled = false;
}
}
答案 1 :(得分:0)
感谢您的回答。
无论如何,我已设法通过以下方式解决问题:
1)我添加了:
private Person FindPerson(string name)
{
return people.Find(x => x.Name == name);
}
2)我已经取代:
people[listView1.SelectedItems[0].Index]
与“人”,其中人是:
Person person = FindPerson(listView1.SelectedItems[0].Text);
其中FindPerson是:
private Person FindPerson(string name)
{
return people.Find(x => x.Name == name);
}
无论如何,当我尝试删除最后剩余的联系时,我一直收到错误。即使我尝试选择它,也不仅仅是删除它。在这里你可以看看错误是什么:
图片:http://s24.postimg.org/ls4nak6et/Kruzeri.png
所以,这就是现在的样子:
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count == 0) return;
Person person = FindPerson(listView1.SelectedItems[0].Text);
textBox1.Text = person.Name;
textBox2.Text = person.Hometown;
textBox3.Text = person.Address;
textBox4.Text = person.Phone;
textBox5.Text = person.Email;
textBox6.Text = person.AdditionalInfo;
dateTimePicker1.Value = person.Birthday;
textBox1.ReadOnly = true;
textBox2.ReadOnly = true;
textBox3.ReadOnly = true;
textBox4.ReadOnly = true;
textBox5.ReadOnly = true;
textBox6.ReadOnly = true;
dateTimePicker1.Enabled = false;
toolStripButton5.Enabled = true;
}
和保存按钮:
private void toolStripButton1_Click(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count > 0)
{
Person person = FindPerson(listView1.SelectedItems[0].Text);
person.Name = textBox1.Text;
person.Hometown = textBox2.Text;
person.Address = textBox3.Text;
person.Phone = textBox4.Text;
person.Email = textBox5.Text;
person.Birthday = dateTimePicker1.Value;
person.AdditionalInfo = textBox6.Text;
listView1.SelectedItems[0].Text = textBox1.Text;
textBox1.ReadOnly = true;
textBox2.ReadOnly = true;
textBox3.ReadOnly = true;
textBox4.ReadOnly = true;
textBox5.ReadOnly = true;
textBox6.ReadOnly = true;
dateTimePicker1.Enabled = false;
}
else
{
MessageBox.Show("Nothing is selected ", "Notification", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
UserCount();
}
答案 2 :(得分:0)
您的函数返回null,因为未选择任何项目。所以人当然是空的。您应该在FindPerson-Function中处理此问题。