2016-09-20 14 views
0

私はプログラミングとこのフォーラムに慣れていません。私は答えをフォーラムで検索しましたが、私にはうってつけのものは見つかりませんでした。私は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:

いけない、これは答えるための正しい方法であれば知っているが、コメントセクションでは、私が長い答えを投稿しましょうdidntの。

とても助けてくれてありがとう。私はあなたのコードをリストに追加しようとしましたが、エラーコードがあります:System.Collecion.Generic.ListをSystem.Windows.Forms.ListBox.ObjectCollectionに変換できません。 Webを検索して解決策を探したが、短くなった。私のコード全体を投稿しますか?また、あなたの検索コードを試してみました。しかし、私の主な問題はまだそこにあります。検索結果をクリックすると、リストボックスの名前が連絡先リスト全体の最初の連絡先の連絡先情報を表示します。連絡先のインデックスがリストボックスにあるかのように、リストボックス内の連絡先が検索機能によってソートされると、検索された連絡先に最初の連絡先インデックスが与えられます。すべてを明確にするために私のコード全体を投稿しますか?すべての助けをありがとう!

EDIT2:ここにコードがあります。私はperson propertysを持つクラスを持っています。名前、住所、postnummber、市、電話とリストにリンクしている電子メール。

私はいくつかのコメントがスウェーデン語であり、それは面倒です知っている。あなたが理解できないものがあれば教えてください。

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パラメータを使用できます。コードは無利益のためにメモリを無駄に終わる一時的な文字列を生成を避けIndexOf代わりのContainsToLower()を使用することにより

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

:コードビットクリーンにするために、私は別のContainsCIメソッドを作成しました。

用語が空の場合はString.ContainsContainsCIの両方が返信trueになります。これにより、検索ボックスが空の場合にすべてのアイテムを簡単に返すことができます。

+1

ありがとう、それを修正しました –

+0

上記の私の主な質問に答えました。コメント欄はわかりませんでした。 – AllramEst

関連する問題