2016-11-02 1 views
0

Je souhaite ajouter une fonction de recherche à mon application, j'ai vu de nombreux exemples cependant, toutes les données sont ajoutées par le programmeur. Comment pourrais-je implémenter une fonction de recherche où les paramètres/valeurs ne sont pas prédéfinis. Je devine que je devrais créer une autre instance d'une liste car j'en utilise déjà une?C# - Recherche de sous-chaîne à partir de l'entrée utilisateur

 public Form1() 
    { 
     InitializeComponent(); 
    } 

    List<Book> books = new List<Book>(); 


    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    //Settng Values 
    public void button1_Click(object sender, EventArgs e) 
    { 

     Book b = new Book(); 
     b.Title = textBox1.Text; 
     b.ISBN = textBox2.Text; 
     b.Onloan = trueCheckBox.Checked; 
     listView1.Items.Add(b.Title + ", " + b.ISBN + ", " + b.Onloan); 
     books.Add(b); 
     textBox1.Text = null; 
     textBox2.Text = null; 

    } 

    //Method to check if item is aviable or note - boolean type 
    void avaiable() 
    { 
     if (trueCheckBox.Checked = true) 
     { 



      bool onloan = true; 
     } 

     else 
     { 
      bool onloan = false; 
     } 
    } 


    private void button2_Click(object sender, EventArgs e) 
    { 
     Remove(); 
    } 

    //Remove item from both the List & Listview 
    void Remove() 
    { 

     try 
     { 

      listView1.Items.Remove(listView1.SelectedItems[0]); 
      books.RemoveAt(listView1.SelectedItems[0].Index); 

     } 
     catch 
     { 

     } 
    } 


    //Display information within their field when selected an item is selected 
    private void listView1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (listView1.SelectedItems.Count == 0) 
     { 
      return; 
     } 
     else 
     { 


      textBox1.Text = books[listView1.SelectedItems[0].Index].Title; 
      textBox2.Text = books[listView1.SelectedItems[0].Index].ISBN; 
      trueCheckBox.Checked = books[listView1.SelectedItems[0].Index].Onloan; 
     } 
    } 


    //Update the values without having to re-add 
    private void button3_Click(object sender, EventArgs e) 
    { 
     if (listView1.SelectedItems.Count == 0) 
     { 
      return; 
     } 
     else 
     { 
      books[listView1.SelectedItems[0].Index].Title = textBox1.Text; 
      books[listView1.SelectedItems[0].Index].ISBN = textBox2.Text; 
      books[listView1.SelectedItems[0].Index].Onloan = trueCheckBox.Checked; 
      listView1.SelectedItems[0].Text = textBox1.Text + ", " + textBox2.Text + ", "+ trueCheckBox.Checked; 
     } 
    } 

    private void searchBox_TextChanged(object sender, EventArgs e) 
    { 
     //Here's where I am stuck, I've added a textField and labelled it search box 
    } 
} 


//Class - set & get methods 
class Book 
{ 

    public string isbn; 
    public string title; 
    private Boolean onloan; 


    public Book() 
    { 
     this.isbn = isbn; 
     this.title = title; 
    } 

    public string ISBN 
    { 
     get { return isbn; } 
     set { isbn = value; } 
    } 
    public string Title 
    { 

     get { return title; } 
     set { title = value; } 
    } 
    public Boolean Onloan 
    { 
     get { return onloan; } 
     set { onloan = value; } 
    } 

} 

}

Merci.

EDIT-

Essentiellement, la fonction de recherche devrait permettre à l'utilisateur de rechercher un livre en utilisant seulement une sous-à-dire « Mars » devrait retourner un livre avec le titre « Le programmeur de Mars » < (Juste une Exemple). Je suppose que je devrais utiliser la méthode .Contain?

+2

Effectuez des recherches dans [LINQ] (https://msdn.microsoft.com/fr-fr/library/bb907066.aspx).Un conseil: 'de livre dans les livres où book.Title.Contains (" Mars ")' ... –

Répondre

1

En supposant books est la liste des livres à la recherche de:

List<Book> searchResult = books.Where(b => b.Title.Contains(searchTerm)).ToList();

Ceci renvoie une liste de livres où la chaîne d'entrée se trouve dans le titre. Vous pouvez faire correspondre exactement avec b.Title == searchTerm et similaire avec les autres propriétés de Book.

La syntaxe ci-dessus est LINQ et peut être un peu déroutant au début, mais fonctionne très bien pour des choses comme ça.

Edit:

Pour l'utiliser, vous aurez envie using System.Linq;

Depuis votre recherche semble être sur TextChanged, vous voudriez mettre ce code dans votre méthode searchBox_TextChanged():

Cette obtient la zone de texte que l'utilisateur est en train de taper dans:

TextBox searchTerm = sender as TextBox;

Ce filtre votre liste de livres par la recherche en cours:

List<Book> searchResult = books.Where(b => b.Title.Contains(searchTerm.Text)).ToList();

note comme dans l'autre réponse que vous pouvez faire ToLower() (ou supérieur) pour effectuer des recherches insensibles à la casse.

Tout ce qu'il reste à faire maintenant est d'afficher le résultat filtré searchResult retour à l'utilisateur.

+0

Je suis essayé en utilisant cela, mais j'ai beaucoup d'erreurs. Ai-je besoin d'importer certaines bibliothèques/collections pour utiliser LINQ? – TheNoviceProgrammer

2

Correct, vous devrez utiliser la méthode "Contient". Notez que "Contient" est sensible à la casse, vous devrez donc répondre à cela.

Vous auriez quelque chose comme:

var textToSearch = searchBox.Text.ToLower(); 

var foundBooks = books.Where(book => book.Title.ToLower().Contains(textToSearch)).ToList(); 
+0

Ah merci, pourriez-vous me dire où dans mon code je placerais ceci? Je devine au sommet car c'est une variable, mais encore une fois c'est une fonction. Ah! Tellement confus mais merci! – TheNoviceProgrammer

0

réussi à le faire, c'est mon code et il fonctionne. Si quelqu'un veut l'utiliser pour référence future, il l'est.

 private void button4_Click(object sender, EventArgs e) 
    { 
     listView1.SelectedItems.Clear(); 

     for (int i = listView1.Items.Count -1; i >= 0; i--) 
     { 
      if (listView1.Items[i].ToString().ToLower().Contains(searchBox.Text.ToLower())) { 

       listView1.Items[i].Selected = true; 

      } 
     }