Listview选择的项目值 - 而不是索引

时间:2013-11-18 23:54:50

标签: c# listview selecteditem listviewitem

我正在开发一个供个人使用的项目(简单的电话簿)。 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

有没有人有解决方案?

3 个答案:

答案 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中处理此问题。