Populate Combobox from a list
Asked Answered
D

7

16

Newb here, I'm currently working on a form which has a combo box, which will show several Charlie Brown TV specials which you can click on to select and see a description of, rating, runtime, etc. I'm close but I'm not there in terms of populating the combo box and i'm hoping for some help and guidance. I have looked at several things others have done but i'm not knowledgeable enough to deduce the answers from what i've been able to see so far.

Right now i'm trying too: 1. get the listings from your load method 2. loop through them 3. Access my combo box to populate the box with the times from the listing.

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



}

}

So this is what i'm trying to do to populate my combo box. Any help is thankfully received.

Dunkle answered 3/12, 2013 at 6:31 Comment(2)
Your code already uses loops and accesses the combo box. What exactly is keeping you from getting the list, looping over it and adding each elements text to the combobox?Granddaddy
When i run it (click the green arrow to compile/test) the box doesn't populate. So that suggests to me that i've no idea of what I'm doing. Generally speaking, as i'm a newb, i can tell you i have no idea of what i'm doing. I was hoping the combo box would populate with the first piece from each line in my text document.Dunkle
T
23

I would hold List<Listing> at the class level so you can access it when a user clicks on it. I would also throw this on it's own thread and not directly in the Load event. If it's a long process you will hang the ui.

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

Load

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

When the user selects the item

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

if (film != null)
{
    //do work
}
Trumpet answered 3/12, 2013 at 6:49 Comment(6)
I will try this out and report back. Thank youDunkle
I tried this but i was not able to make it work. It seems like it would work but for me it did not. I thank you for your assistance. You are awesome.Dunkle
Can you post your code with this so I can look and see why it wasn't working for you.Trumpet
I've updated the code to show my latest attempt to implement your suggestion. I put all the code into the form1.cs file.Errors happen on lines 69: 'film' can't be declared as it would change film used in child; Error 2 'System.Collections.Generic.IEnumerable<a100___GUI___VideoStoreSelections.Listing>' does not contain a definition for 'FistOrDefault' and no extension method 'FistOrDefault' accepting first argument of type 'System.Collections.Generic.IEnumerable<a100___GUI___VideoStoreSelections.Listing>' could be found (are you missing a using directive/assembly reference?)Dunkle
I don't know what exactly, I went over this with my teacher who said that yes it ought to work. She gave the file a debug zap or something like that. Open and closed it a few times and then it worked. She said the issue was that the last method simply wasn't running - we aren't sure why it wasn't but it just self started when we changed computers. Now its' good. Sort fo a mystery I guess.Dunkle
You can just add the object directly to the combobox. Just overrride the ToString method to set how you want to present it in the combobox. The benefit is that youcan get the entire object with all properties using the SelectedItem property on the combobox.Benavidez
B
6

if you are asking what i think you are asking, you need something like this in your form load:

foreach(Listing listing in LoadListings()){
    cmbMovieListingBox.Items.Add(listing.GetFilmTitle());
}
Barbary answered 3/12, 2013 at 6:40 Comment(2)
Thank you - i Will try this and report back.Dunkle
I tried this but was not able to get it to work. I thank you for your assistance - you are also awesome.Dunkle
V
1

There's one issue with visual controls updating (such as ComboBox etc): you'd rather prevent them from re-painting at each data change (at each item addition in your case):

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
}
Velarium answered 3/12, 2013 at 8:19 Comment(1)
I tried this too, sadly it produced many errors. It looks really smart but i think it is in my attempt to implement it that the errors came wheni put it into the private void FormMovieLookUp_Load(object sender, EventArgs e) method. Thanks. I see what this does, forms are very vexing thingsDunkle
Y
1

A line of the code of Tsukasa doesn't work because it is written FistOrDefault() instead of FirstOrDefault()

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

Sorry I don't have enough point to just add a comment...

Yard answered 12/6, 2017 at 3:15 Comment(0)
M
1

Remove the {get; set;} from the list declaration. It's not needed there.

Define your class like this:

public class Listing
{
    private String filmTitle {get; set;}
    private String description {get; set;};
    …
}

On the form load event set the ComboBox DisplayMember and ValueMember to "filmTitle"

cmbMovieListingBox.DisplayMember = "filmTitle";
cmbMovieListingBox.ValueMember = "filmTitle"

Finally, you must set the DataSource of the ComboBox to the list

cmbMovieListingBox.DataSource = films;

And there you have it. The rest of your code should function now.

Mita answered 30/4, 2020 at 18:34 Comment(0)
P
0

Maybe it will help somebody. But in my situation I had to use cmbMovieListingBox.Text instead of cmbMovieListingBox.SelectedValue (like @Tsukasa example):

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

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

And also FirstOrDefault() instead of FistOrDefault().

Hope it helps to someone

Pairoar answered 20/7, 2017 at 7:44 Comment(0)
P
0

that what i did to my Code

int Count;
foreach(String i in Languages)
{
    LangComboBox.Items.Add(Languages[Count]);
    Count++;
}
Pedicle answered 8/11, 2021 at 12:38 Comment(1)
Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.Cardoon

© 2022 - 2024 — McMap. All rights reserved.