リストからコンボボックスにデータを入力します

2013年12月03日に質問されました。  ·  閲覧回数 83.7k回  ·  ソース

Chezshire picture
2013年12月03日

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

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



}

}

これが、コンボボックスにデータを入力するために私がやろうとしていることです。 どんな助けでもありがたいことに受け取られます。

回答

Tsukasa picture
2013年12月03日
21

List<Listing>をクラスレベルで保持して、ユーザーがクリックしたときにアクセスできるようにします。 また、Loadイベントに直接ではなく、独自のスレッドにこれをスローします。 長いプロセスの場合は、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
}
domskey picture
2013年12月03日
5

あなたが私があなたが求めていると思うものを尋ねているなら、あなたはあなたのフォームロードにこのようなものが必要です:

foreach(Listing listing in LoadListings()){
    cmbMovieListingBox.Items.Add(listing.GetFilmTitle());
}
Dmitry Bychenko picture
2013年12月03日
1

ビジュアルコントロールの更新(ComboBoxなど)には1つの問題があります。データが変更されるたびに(この場合はアイテムが追加されるたびに)、ビジュアルコントロールが

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
}
John Leon picture
2017年06月12日
1

Tsukasaのコードの行は、FirstOrDefault()ではなくFistOrDefault()と記述されているため、機能しません。

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

申し訳ありませんが、コメントを追加するだけのポイントがありません...

Vlad Pulichev picture
2017年07月20日
0

多分それは誰かを助けるでしょう。 しかし、私の状況では、 cmbMovieListingBox.Text代わりにcmbMovieListingBox.SelectedValue cmbMovieListingBox.Textを使用する必要がありました(@Tsukasaの例のように):

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

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

また、 FirstOrDefault()代わりにFistOrDefault()

それが誰かに役立つことを願っています

Paulo Jorge Gon&#231;alves Pinto picture
2020年05月01日
0

リスト宣言から{get; set;}を削除します。 そこには必要ありません。

次のようにクラスを定義します。

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

フォームの読み込みイベントで、 ComboBox DisplayMemberValueMemberを「filmTitle」に設定します

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

最後に、 ComboBoxDataSourceをリストに設定する必要があります

cmbMovieListingBox.DataSource = films;

そして、あなたはそれを持っています。 これで、残りのコードが機能するはずです。