所选索引和排序方法没有协同作用

本文关键字:作用 方法 索引 排序 | 更新日期: 2023-09-27 18:24:17

我正试图通过使用Listbox对Listbox中的列表进行排序。Sorted=true;

问题是,如果我选择列表中的第四个东西,它会选择第四个插入的东西,而不是排序后的第四件东西。

所以我想到了listBox。Sorted只是对实际显示的内容进行排序,而不是对其后面的原始列表进行排序。

        private void Form1_Load()
    {
        XmlDocument xDoc = new XmlDocument();
            xDoc.Load(path + "''contactz''testing.xml");
            foreach (XmlNode xNode in xDoc.SelectNodes("People/Person"))
            {
                Person p = new Person();
                p.surname = xNode.SelectSingleNode("surname").InnerText;
                p.first_name = xNode.SelectSingleNode("first_name").InnerText;
                p.street_address = xNode.SelectSingleNode("street_address").InnerText;
                p.postcode = xNode.SelectSingleNode("postcode").InnerText;
                p.suburb = xNode.SelectSingleNode("suburb").InnerText;
                p.email = xNode.SelectSingleNode("email").InnerText;
                p.phone = xNode.SelectSingleNode("phone").InnerText;
                p.mobile_phone = xNode.SelectSingleNode("mobile_phone").InnerText;
                people.Add(p);
                listBox.Items.Add(p.surname + ", " + p.first_name);
                listBox.Sorted = true;
        }

        private void listBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listBox.SelectedIndex > -1)
        {
            surnameTxt.Text = people[listBox.SelectedIndex].surname;
            firstnameTxt.Text = people[listBox.SelectedIndex].first_name;
            addressTxt.Text = people[listBox.SelectedIndex].street_address;
            suburbTxt.Text = people[listBox.SelectedIndex].suburb;
            postcodeTxt.Text = people[listBox.SelectedIndex].postcode;
            emailTxt.Text = people[listBox.SelectedIndex].email;
            phoneTxt.Text = people[listBox.SelectedIndex].phone;
            mobileTxt.Text = people[listBox.SelectedIndex].mobile_phone;
        }
    }

删除了很多不必要的代码,所以看起来可能有点古怪。

我试着在几点上将listBox.topIndex设置为0,但似乎没有任何作用。

感谢

所选索引和排序方法没有协同作用

从您的代码中,您对listBox.Items而不是people进行排序,并且您没有将people用作listBox:的Datasource

 //....
 people.Add(p);
 listBox.Items.Add(p.surname + ", " + p.first_name);
 listBox.Sorted = true;
 //....

这就是为什么使用listboxSelectedIndex无法从people中获得正确的项目。就像你所做的,因为它们无论如何都没有链接:

 surnameTxt.Text = people[listBox.SelectedIndex].surname;

相反,您可以设置listBox.DataSource=people,只对people进行排序。

请注意,当列表绑定到DataSource:时,不应该使用ListBox.Sorted属性对列表进行排序

Sorted设置为true的ListBox不应使用DataSource属性绑定到数据。要在绑定的ListBox中显示排序后的数据,您应该绑定到支持排序的数据源,并让数据源提供排序。

而不是使用listBox.Sorted = true;

我通过使用对实际列表进行排序;

people.Sort((x, y) => string.Compare(x.surname, y.surname));

现在效果很好。