2016-09-20 4 views
0

Я новичок в программировании и на этом форуме. Я искал форум для ответов, но не нашел ничего, что работает для меня. Я создал adressbook в 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. Искал веб-решение, но не понял. Должен ли я опубликовать весь свой код? Также попробовал ваш поисковый код, он отлично работает. Но моя главная проблема все еще существует. Когда я нажимаю на результаты поиска, имя в списке показывает контактную информацию первого контакта во всем списке контактов. Как будто индекс контактов по-прежнему находится в списке, но когда контакты в Listbox сортируются функцией поиска, первый контактный указатель присваивается контакту найденному поиску. Должен ли я опубликовать весь свой код, чтобы сделать все более ясным.? Спасибо за помощь!

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; 
    } 
} 

}

+5

'ListBoxOne.Items.Add (TempVar);' вы определенно хотите 'ListBoxOne.Items.Add (item);' – Jonesopolis

+0

Я не вижу ни класса «Contact», ни «adressBook», ни что-либо еще на этот вопрос. – HimBromBeere

+3

Еще лучше, 'AddRange (TempVar)' –

ответ

4

Ваш код имеет опечатка. Вместо добавления отдельных элементов вы добавляете список в список. Вы должны добавить отдельные элементы:

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

Лучшим вариантом хотя бы использовать AddRange, чтобы добавить весь список сразу:

ListBoxOne.Items.AddRange(TempVar); 

Вы можете улучшить остальную часть кода, а также. Вместо Contains, который чувствителен к регистру, вы можете использовать IndexOf с параметром StringComparison без учета регистра. Для того, чтобы сделать код немного понятнее, я создал отдельный 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 вместо Contains и ToLower() код позволяет избежать создания временных строк, которые в конечном итоге тратить памяти не получить.

Обратите внимание, что оба String.Contains и ContainsCI возвращают true, если этот термин пуст. Это упрощает возврат всех элементов, если поле поиска пуст.

+1

Спасибо, исправлено –

+0

Ответил в моем главном вопросе выше. Ящик комментариев не дал мне долгого ответа. – AllramEst

Смежные вопросы