web-dev-qa-db-fra.com

Remplir Combobox à partir d'une liste

Newb ici, Je travaille actuellement sur un formulaire comportant une zone de liste déroulante, qui présente plusieurs émissions spéciales de Charlie Brown TV sur lesquelles vous pouvez cliquer pour sélectionner et afficher une description, la notation, l'exécution, etc. Je suis proche mais je ne suis pas là-bas en termes de remplir la zone de liste déroulante et j'espère de l'aide et des conseils. J'ai examiné plusieurs choses que d'autres ont faites mais je ne suis pas assez informé pour déduire les réponses de ce que j'ai pu voir jusqu'à présent.

En ce moment, j'essaie aussi: 1. obtenir les listes à partir de votre méthode de chargement 2. boucle à travers eux 3. Accédez à ma liste déroulante pour remplir la boîte avec les heures de la liste.

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Globalization;//Used for Sting.ToUpperCase...
using System.Threading;

using System.Threading.Tasks;// Needed for Streaming...
using System.IO;// Needed for Streaming...


namespace a100___GUI___VideoStoreSelections
{
public partial class FormMovieLookUp : Form
{
    private const String FILE_NAME = "txt_movieDescriptions.txt";//connect to text file in debug

    private List<Listing> films { get; set; }

    public FormMovieLookUp()
    {
        InitializeComponent();
    }

    private void cmbMovieListingBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        txtTitleBox.Text = cmbMovieListingBox.SelectedItem.ToString();
    }

    //ToolBox -- my program specific tools
    public List<Listing> LoadListings()//load movie descriptions as list
    {
        StreamReader fileIn = new StreamReader(FILE_NAME);
        List<Listing> entries = new List<Listing>();

        //loop through every line of the file
        while (!fileIn.EndOfStream)
        {
            String line = fileIn.ReadLine();
            String[] pieces = line.Split(':');

            if (pieces.Length < 4) continue;//error handling - set to length of text items

            Listing myListing = new Listing(pieces[0], pieces[1], pieces[2], pieces[3]);
            entries.Add(myListing);
        }
        fileIn.Close();
        return entries;
    }

    private void FormMovieLookUp_Load_1(object sender, EventArgs e)
    {
        films = LoadListings();
        foreach (Listing film in films)
        {
            Console.WriteLine(film);
            cmbMovieListingBox.Items.Add(film.GetFilmTitle());
        }
    }
}
}

Listing.CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace a100___GUI___VideoStoreSelections
{

public class Listing
{
    private String filmTitle;
    private String description;
    private String filmRunTime;
    private String filmRating;

    public Listing(String filmTitle, String description, String filmRunTime, String filmRating)
    {
        this.filmTitle = filmTitle;
        this.description = description;
        this.filmRunTime = filmRunTime;
        this.filmRating = filmRating;
    }

    public String GetFilmTitle() { return filmTitle; }
    public String GetDescription() { return description; }
    public String GetFilmRunTime() { return filmRunTime; }
    public String GetFilmRating() { return filmRating; }



}

}

C'est ce que j'essaie de faire pour remplir ma liste déroulante. Toute aide est heureusement reçue.

8
Chezshire

Je tiens List<Listing> au niveau de la classe afin que vous puissiez y accéder quand un utilisateur clique dessus. Je voudrais aussi jeter cela sur son propre fil et pas directement dans l'événement Load. Si le processus est long, vous bloquez l'interface utilisateur.

private List<Listing> films { get; set; }

Charge

films = LoadListings();
foreach (Listing film in films)
{
    cmbMovieListingBox.Items.Add(film.GetFilmTitle());
}

Lorsque l'utilisateur sélectionne l'élément

Listing film = films.Where(f => f.GetFilmTitle().Equals(cmbMovieListingBox.SelectedValue)).FistOrDefault();

if (film != null)
{
    //do work
}
15
Tsukasa

si vous demandez ce que je pense que vous demandez, vous avez besoin de quelque chose comme ceci dans votre formulaire

foreach(Listing listing in LoadListings()){
    cmbMovieListingBox.Items.Add(listing.GetFilmTitle());
}
4
domskey

Il y a un problème avec la mise à jour des contrôles visuels (tels que ComboBox, etc.): vous préférez les empêcher de repeindre à chaque changement de données (à chaque ajout d'élément dans votre cas):

cmbMovieListingBox.BeginUpdate(); // <- Stop painting

try {
  // Adding new items into the cmbMovieListingBox 
  foreach(var item in LoadListings())
    cmbMovieListingBox.Items.Add(item.GetFilmTitle());
finally {
  cmbMovieListingBox.EndUpdate(); // <- Finally, repaint if required
}
1
Dmitry Bychenko

Une ligne du code de Tsukasa ne fonctionne pas car elle est écrite FistOrDefault () au lieu de FirstOrDefault () 

Listing film = films.Where(f => f.GetFilmTitle().Equals(cmbMovieListingBox.SelectedValue)).**First**OrDefault();

Désolé, je n'ai pas assez de points pour ajouter un commentaire ...

1
John Leon

Cela aidera peut-être quelqu'un. Mais dans ma situation, je devais utiliser cmbMovieListingBox.Text au lieu de cmbMovieListingBox.SelectedValue (comme dans l'exemple de @Tsukasa):

Listing film = films.Where(f => f.GetFilmTitle().Equals(cmbMovieListingBox.Text)).FirstOrDefault();

if (film != null)
{
    //do work
}

Et aussi FirstOrDefault() au lieu de FistOrDefault().

J'espère que ça aide à quelqu'un

0
Vlad Pulichev