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.

Chezshire
  • 713
  • 5
  • 13
  • 32
  • 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? – nvoigt Dec 03 '13 at 06:39
  • 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. – Chezshire Dec 03 '13 at 07:03

7 Answers7

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
}
CDspace
  • 2,639
  • 18
  • 30
  • 36
Tsukasa
  • 6,342
  • 16
  • 64
  • 96
  • I will try this out and report back. Thank you – Chezshire Dec 03 '13 at 07:01
  • 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. – Chezshire Dec 03 '13 at 15:54
  • Can you post your code with this so I can look and see why it wasn't working for you. – Tsukasa Dec 03 '13 at 16:13
  • 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' does not contain a definition for 'FistOrDefault' and no extension method 'FistOrDefault' accepting first argument of type 'System.Collections.Generic.IEnumerable' could be found (are you missing a using directive/assembly reference?) – Chezshire Dec 03 '13 at 19:07
  • 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. – Chezshire Dec 05 '13 at 01:03
  • 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. – nivs1978 May 14 '19 at 12:47
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());
}
domskey
  • 1,102
  • 11
  • 16
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
}
Dmitry Bychenko
  • 180,369
  • 20
  • 160
  • 215
  • 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 things – Chezshire Dec 03 '13 at 16:04
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...

Alexandru Marculescu
  • 5,569
  • 6
  • 34
  • 50
John Leon
  • 19
  • 5
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.

Momoro
  • 599
  • 4
  • 23
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

Vlad Pulichev
  • 3,162
  • 2
  • 20
  • 34
0

that what i did to my Code

int Count;
foreach(String i in Languages)
{
    LangComboBox.Items.Add(Languages[Count]);
    Count++;
}
Peter Csala
  • 17,736
  • 16
  • 35
  • 75
GAP
  • 41
  • 1
  • 5
  • 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](/help/how-to-answer). – Community Nov 08 '21 at 12:39