查找列表

时间:2016-09-20 13:45:09

标签: c# .net winforms

我是编程和本论坛的新手。我在论坛上搜索了答案,但没有发现任何对我有用的东西。我在WinForms中创建了一个带有搜索功能的地址簿。搜索找到指定的联系人,但是当我单击联系人时,它加载的信息属于列表中的第一个联系人。对于第一次联系的列表中的每个联系人都会发生这种情况。

var TempVar = People.Where(a => a.Namn.ToLower().Contains(txtSearchbar.Text.ToLower()) ||
            a.PostOrt.ToLower().Contains(txtSearchbar.Text.ToLower())).ToList();

            foreach (var item in TempVar)
            {
                ListBoxOne.Items.Add(TempVar);
            }

告诉我您是否需要更多信息。感谢您的帮助!!

EDIT1:

不知道这是否是正确的回答方式,但是评论部分没有让我发表长篇答案。

首先。谢谢你的帮助。我尝试将代码添加到列表中,但得到了错误代码:无法将System.Collecion.Generic.List转换为System.Windows.Forms.ListBox.ObjectCollection。搜索网络寻求解决方案但是做得很短。我可以发布我的整个代码吗?还尝试了你的搜索代码它很棒。但我的主要问题仍然存在。当我单击搜索结果时,列表框中的名称会显示整个联系人列表中第一个联系人的联系信息。它好像联系人的索引仍在列表框中,但当列表框中的联系人被搜索功能整理出来时,第一个联系人索引将被提供给搜索找到的联系人。我应该发布我的整个代码,以使一切更清晰。谢谢你的帮助!

EDIT2:这是代码。我上了一堂人才。姓名,地址,后期,城市,电话和链接到列表的电子邮件。

我知道有些评论是瑞典语,这很麻烦。问我是否有任何你不理解的东西。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    List<Person> People = new List<Person>();//Skapar en lista med alla variabler i Person

    private void Form1_Load(object sender, EventArgs e)//Reads file on start up.
    {
        //string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
        if (Directory.Exists("C:\\visualFolder\\Adressbok"))
        {
            Directory.CreateDirectory("C:\\visualFolder\\Adressbok");
        }
        if (!File.Exists("C:\\visualFolder\\Adressbok\\settings.xml"))
        {
            XmlTextWriter XW = new XmlTextWriter("C:\\visualFolder\\Adressbok\\settings.xml", Encoding.UTF8);
            XW.WriteStartElement("People");
            XW.WriteEndElement();
            XW.Close();
        }
        XmlDocument xDoc = new XmlDocument();
        xDoc.Load("C:\\visualFolder\\Adressbok\\settings.xml");

        foreach (XmlNode XNode in xDoc.SelectNodes("People/Person"))
        {
            Person p = new Person();
            p.Namn = XNode.SelectSingleNode("Namn").InnerText;
            p.GatuAdress = XNode.SelectSingleNode("Adress").InnerText;
            p.PostNummer = XNode.SelectSingleNode("Postnummer").InnerText;
            p.PostOrt = XNode.SelectSingleNode("Postort").InnerText;
            p.Telefon = XNode.SelectSingleNode("Telefon").InnerText;
            p.Email = XNode.SelectSingleNode("Email").InnerText;
            People.Add(p);
            ListBoxOne.Items.Add(p.Namn);


        }

    }//----

    private void cmdRegistrera_Click(object sender, EventArgs e)//Adds contact
    {
        Person LäggTillPerson = new Person();
        LäggTillPerson.Namn = txtNamn.Text;
        LäggTillPerson.GatuAdress = txtAdressText.Text;
        LäggTillPerson.PostNummer = txtPostNummer.Text;
        LäggTillPerson.PostOrt = txtPostOrt.Text;
        LäggTillPerson.Telefon = txtTelefonnummer.Text;
        LäggTillPerson.Email = txtEpost.Text;
        People.Add(LäggTillPerson);
        ListBoxOne.Items.Add(LäggTillPerson.Namn);

        txtNamn.Clear();
        txtAdressText.Clear();
        txtPostNummer.Clear();
        txtPostOrt.Clear();
        txtTelefonnummer.Clear();
        txtEpost.Clear();

    }

    private void cmdTaBort_Click(object sender, EventArgs e)//Deletes contact.
    {

        if (ListBoxOne.SelectedItem != null)
        {

            People.RemoveAt(ListBoxOne.SelectedIndex);
            ListBoxOne.Items.Remove(ListBoxOne.SelectedItems[0]);
        }


        txtNamn.Clear();
        txtAdressText.Clear();
        txtPostNummer.Clear();
        txtPostOrt.Clear();
        txtTelefonnummer.Clear();
        txtEpost.Clear();

    }


    private void ListboxOne_SelectedIndexChanged(object sender, EventArgs e)//
    {
        if (ListBoxOne.SelectedItem != null)
        {
            txtNamn.Text = People[ListBoxOne.SelectedIndex].Namn;
            txtAdressText.Text = People[ListBoxOne.SelectedIndex].GatuAdress;
            txtPostNummer.Text = People[ListBoxOne.SelectedIndex].PostNummer;
            txtPostOrt.Text = People[ListBoxOne.SelectedIndex].PostOrt;
            txtTelefonnummer.Text = People[ListBoxOne.SelectedIndex].Telefon;
            txtEpost.Text = People[ListBoxOne.SelectedIndex].Email;
        }

    }

    private void cmdSpara_Click(object sender, EventArgs e)//Saves changes.
    {
        if (ListBoxOne.SelectedItem != null)
        {
            People[ListBoxOne.SelectedIndex].Namn = txtNamn.Text;
            People[ListBoxOne.SelectedIndex].GatuAdress = txtAdressText.Text;
            People[ListBoxOne.SelectedIndex].PostNummer = txtPostNummer.Text;
            People[ListBoxOne.SelectedIndex].PostOrt = txtPostOrt.Text;
            People[ListBoxOne.SelectedIndex].Telefon = txtTelefonnummer.Text;
            People[ListBoxOne.SelectedIndex].Email = txtEpost.Text;

            ListBoxOne.Items.Clear();

            foreach (var item in People)
            {
                ListBoxOne.Items.Add(item.Namn);
            }
        }

        MessageBox.Show("Ändringarna är sparade");

    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)//Saves to file on when closin the application.
    {
        XmlDocument xDoc = new XmlDocument();
        xDoc.Load("C:\\visualFolder\\Adressbok\\settings.xml");
        XmlNode xNode = xDoc.SelectSingleNode("People");
        xNode.RemoveAll();

        foreach (Person p in People)
        {
            XmlNode xTop = xDoc.CreateElement("Person");
            XmlNode Xnamn = xDoc.CreateElement("Namn");
            XmlNode Xadress = xDoc.CreateElement("Adress");
            XmlNode XPostnummer = xDoc.CreateElement("Postnummer");
            XmlNode XpostOrt= xDoc.CreateElement("Postort");
            XmlNode Xtelefon = xDoc.CreateElement("Telefon");
            XmlNode XeMAil = xDoc.CreateElement("Email");

            Xnamn.InnerText = p.Namn;
            Xadress.InnerText = p.GatuAdress;
            XPostnummer.InnerText = p.PostNummer;
            XpostOrt.InnerText = p.PostOrt;
            Xtelefon.InnerText = p.Telefon;
            XeMAil.InnerText = p.Email;

            xTop.AppendChild(Xnamn);
            xTop.AppendChild(Xadress);
            xTop.AppendChild(XPostnummer);
            xTop.AppendChild(XpostOrt);
            xTop.AppendChild(Xtelefon);
            xTop.AppendChild(XeMAil);

            xDoc.DocumentElement.AppendChild(xTop);

        }
        xDoc.Save("C:\\visualFolder\\Adressbok\\settings.xml"); 


    }

    private void cmdSök_Click(object sender, EventArgs e)//Search function. This is where the problem is. 
    {

        if (txtSearchbar.Text != "")
        {

            var term = txtSearchbar.Text;
            var results = People.Where(a => ContainsCI(a.Namn, term)
                                         || ContainsCI(a.PostOrt, term));

            foreach (var item in results)
            {
                ListBoxOne.Items.Add(item);
            }

            ListBoxOne.Items.Clear();


            foreach (var item in results)
            {
                ListBoxOne.Items.Add(item.Namn);
            }
            txtSearchbar.Clear();


        }

        else
        {
            ListBoxOne.Items.Clear();

            foreach (var item in People)
            {
                ListBoxOne.Items.Add(item.Namn);
            }


        }

    }

    private void cmdClearSearch_Click(object sender, EventArgs e)//Clears the searchebar and ListBox and loads the contacts again.
    {
        ListBoxOne.Items.Clear();
        txtSearchbar.Clear();

        foreach (var item in People)
        {
            ListBoxOne.Items.Add(item.Namn);
        }


        txtNamn.Clear();
        txtAdressText.Clear();
        txtPostNummer.Clear();
        txtPostOrt.Clear();
        txtTelefonnummer.Clear();
        txtEpost.Clear();

    }

    public bool ContainsCI(string input, string term)//Search function. courtesy of Panagiotis Kanavos
    {
        if (String.IsNullOrWhiteSpace(input))
        {
            return false;
        }
        //Returns true even if `terms` is empty, just like String.Contains
        return input.IndexOf(term, StringComparison.CurrentCultureIgnoreCase) != -1;
    }
}

}

1 个答案:

答案 0 :(得分:4)

您的代码有拼写错误。您不必添加单个项目,而是将列表本身添加到列表框中。您应该添加单个项目:

foreach (var item in TempVar)
{
    ListBoxOne.Items.Add(item);
}

更好的选择是使用AddRange一次添加整个列表:

ListBoxOne.Items.AddRange(TempVar);

您也可以改进其余的代码。您可以将IndexOf与不区分大小写的StringComparison参数一起使用,而不是区分大小写的Contains。为了使代码更清晰,我创建了一个单独的ContainsCI方法:

public bool ContainsCI(string input, string term)
{
  if (String.IsNullOrWhitespace(input))
  {
       return false;
  }
  //Returns true even if `terms` is empty, just like String.Contains
  return input.IndexOf(term,StringComparison.CurrentCultureIgnoreCase)!= -1);
}

...

var term=txtSearchbar.Text;
var results= People.Where(a => ContainsCI(a.Namn, term)
                            || ContainsCI(a.PostOrt,term));

ListBoxOne.Items.AddRange(results);

通过使用IndexOf代替ContainsToLower(),代码可以避免生成临时字符串,最终会浪费内存而无法获得收益。

请注意,如果该字词为空,则String.ContainsContainsCI都会返回true。如果搜索框为空,这样可以轻松返回所有项目。