Заполнить Combobox из списка
Newb здесь, В настоящее время я работаю над формой, в которой есть поле со списком, в котором будет показано несколько Чарли Брауна ТВ, которые вы можете нажать, чтобы выбрать и посмотреть описание, рейтинг, время выполнения и т. д. Я близко, но я не там с точки зрения заполнения поля со списком и я надеюсь на некоторую помощь и руководство. Я просмотрел несколько вещей, которые сделали другие, но я недостаточно осведомлен, чтобы вывести ответы из того, что я смог увидеть до сих пор.
сейчас я тоже пытаюсь : 1. получить списки из вашего метода загрузки 2. петля через них 3. Откройте поле со списком, чтобы заполнить поле временем из списка.
форма 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());
}
}
}
}
листинг.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; }
}
}
Так вот что я пытаюсь сделать, чтобы заполнить поле со списком. Любая помощь с благодарностью принимается.
5 ответов
Я бы List<Listing>
на уровне класса, чтобы вы могли получить к нему доступ, когда пользователь нажимает на него. Я бы также бросил это на свой собственный поток, а не непосредственно в событии загрузки. Если это долгий процесс, вы повесите ui.
private List<Listing> films { get; set; }
загрузить
films = LoadListings();
foreach (Listing film in films)
{
cmbMovieListingBox.Items.Add(film.GetFilmTitle());
}
когда пользователь выбирает элемент
Listing film = films.Where(f => f.GetFilmTitle().Equals(cmbMovieListingBox.SelectedValue)).FistOrDefault();
if (film != null)
{
//do work
}
Если вы спрашиваете, что я думаю, что вы спрашиваете, вам нужно что-то вроде этого в вашей загрузке формы:
foreach(Listing listing in LoadListings()){
cmbMovieListingBox.Items.Add(listing.GetFilmTitle());
}
есть одна проблема с обновлением визуальных элементов управления (например, ComboBox и т. д.): Вы бы предпочли предотвратить их от перекраска при каждом изменении данных (при каждом добавлении элемента в вашем случае):
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
}
строка кода Tsukasa не работает, потому что она написана FistOrDefault () вместо FirstOrDefault ()
Listing film = films.Where(f => f.GetFilmTitle().Equals(cmbMovieListingBox.SelectedValue)).**First**OrDefault();
Извините, у меня недостаточно точки, чтобы просто добавить комментарий...
может быть, это поможет кому-то. Но в моей ситуации я должен был использовать cmbMovieListingBox.Text
вместо cmbMovieListingBox.SelectedValue
(как пример @Tsukasa):
Listing film = films.Where(f => f.GetFilmTitle().Equals(cmbMovieListingBox.Text)).FirstOrDefault();
if (film != null)
{
//do work
}
и FirstOrDefault()
вместо FistOrDefault()
.
надеюсь, что это поможет кому-то