it-swarm.com.de

Kombinieren Sie Combobox aus einer Liste

Newb hier, Ich arbeite gerade an einem Formular, das eine Kombinationsbox enthält, in der verschiedene Charlie Brown-TV-Specials angezeigt werden, auf die Sie klicken können, um eine Beschreibung, Bewertung, Laufzeit usw. anzuzeigen Dort bin ich in Bezug auf das Ausfüllen der Combo-Box und ich hoffe auf Hilfe und Anleitung. Ich habe mir einige Dinge angesehen, die andere gemacht haben, aber ich bin nicht wissend genug, um die Antworten aus dem abzuleiten, was ich bisher sehen konnte.

Im Moment versuche ich es auch: 1. Holen Sie sich die Auflistungen von Ihrer Lademethode 2. durchlaufen sie 3. Greifen Sie auf mein Kombinationsfeld zu, um das Feld mit den Zeiten aus der Liste zu füllen.

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



}

}

Ich versuche also, meine Combo-Box zu füllen. Jede Hilfe wird dankend angenommen.

8
Chezshire

Ich würde List<Listing> auf Klassenebene halten, damit Sie darauf zugreifen können, wenn ein Benutzer darauf klickt. Ich würde dies auch auf seinen eigenen Thread werfen und nicht direkt in das Load-Ereignis. Wenn es ein langer Prozess ist, werden Sie die Benutzeroberfläche aufhängen.

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

Belastung

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

Wenn der Benutzer den Artikel auswählt

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

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

wenn Sie fragen, was ich denke, Sie fragen, brauchen Sie etwas in Ihrer Form laden

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

Es gibt ein Problem bei der Aktualisierung der visuellen Steuerelemente (z. B. ComboBox usw.): Sie möchten lieber verhindern, dass bei jeder Datenänderung erneut gezeichnet wird (bei jedem Elementzusatz in Ihrem Fall):

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

Eine Zeile des Codes von Tsukasa funktioniert nicht, weil es FistOrDefault () statt FirstOrDefault () geschrieben wird 

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

Es tut mir leid, ich habe nicht genug Punkt, um nur einen Kommentar hinzuzufügen ...

1
John Leon

Vielleicht hilft es jemandem. In meiner Situation musste ich jedoch cmbMovieListingBox.Text anstelle von cmbMovieListingBox.SelectedValue verwenden (wie beim @Tsukasa-Beispiel):

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

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

Und auch FirstOrDefault() anstelle von FistOrDefault().

Hoffe es hilft jemandem

0
Vlad Pulichev