【问题标题】:Populate Combobox from a list从列表中填充组合框
【发布时间】:2013-12-19 02:38:56
【问题描述】:

这里是新手, 我目前正在制作一个带有组合框的表单,它将显示几个查理布朗电视特别节目,您可以单击以选择并查看描述、评级、运行时间等。我很接近,但我不是在填充组合框方面,我希望得到一些帮助和指导。我看过其他人做过的几件事,但我的知识不够,无法从我目前所看到的内容中推断出答案。

现在我也在尝试: 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; }



}

}

所以这就是我试图填充我的组合框的方法。感谢您提供任何帮助。

【问题讨论】:

  • 您的代码已经使用了循环并访问了组合框。究竟是什么让您无法获取列表、循环遍历列表并将每个元素的文本添加到组合框中?
  • 当我运行它时(单击绿色箭头编译/测试)该框不会填充。所以这向我暗示我不知道我在做什么。一般来说,由于我是新手,我可以告诉你我不知道我在做什么。我希望组合框会填充文本文档中每一行的第一部分。

标签: c# list class combobox populate


【解决方案1】:

如果你问我认为你在问什么,你需要在你的表单加载中这样的东西:

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

【讨论】:

  • 谢谢 - 我会试试这个并报告。
  • 我试过这个,但无法让它工作。我感谢你的帮助 - 你也很棒。
【解决方案2】:

我会在班级级别保留List&lt;Listing&gt;,以便在用户单击它时访问它。我也会把它放在它自己的线程上,而不是直接放在 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
}

【讨论】:

  • 我会试试这个并报告。谢谢
  • 我试过这个,但我无法让它工作。似乎它会起作用,但对我来说却没有。我感谢你的帮助。你太棒了。
  • 你能用这个发布你的代码,这样我就可以看看为什么它不适合你。
  • 我已更新代码以显示我最近尝试实施您的建议。我将所有代码放入 form1.cs 文件中。错误发生在第 69 行:不能声明“电影”,因为它会改变孩子使用的电影;错误 2“System.Collections.Generic.IEnumerable”不包含“FistOrDefault”的定义,并且没有扩展方法“FistOrDefault”接受“System.Collections.Generic.IEnumerable 类型的第一个参数' 可以找到(您是否缺少 using 指令/程序集参考?)
  • 我不知道究竟是什么,我和我的老师讨论过这个问题,他说是的,它应该可以工作。她给文件一个调试zap或类似的东西。打开和关闭它几次,然后它工作。她说问题在于最后一种方法根本没有运行——我们不确定为什么没有运行,但它只是在我们更换计算机时自行启动。现在它很好。我猜这是一个谜。
【解决方案3】:

视觉控件更新存在一个问题(例如 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
}

【讨论】:

  • 我也试过这个,可惜它产生了很多错误。它看起来非常聪明,但我认为这是在我尝试实现它时,当我将它放入私有 void FormMovieLookUp_Load(object sender, EventArgs e) 方法时出现的错误。谢谢。我明白这是做什么的,表单是非常令人烦恼的事情
【解决方案4】:

Tsukasa 的一行代码不起作用,因为它写的是 FistOrDefault() 而不是 FirstOrDefault()

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

抱歉,我没有足够的积分来添加评论...

【讨论】:

    【解决方案5】:

    也许它会对某人有所帮助。但在我的情况下,我不得不使用cmbMovieListingBox.Text 而不是cmbMovieListingBox.SelectedValue(如@Tsukasa 示例):

    Listing film = films.Where(f => f.GetFilmTitle().Equals(cmbMovieListingBox.Text)).FirstOrDefault();
    
    if (film != null)
    {
        //do work
    }
    

    还有FirstOrDefault() 而不是FistOrDefault()

    希望对某人有所帮助

    【讨论】:

      【解决方案6】:

      从列表声明中删除{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;
      

      你有它。您的其余代码现在应该可以运行了。

      【讨论】:

        【解决方案7】:

        我对代码所做的事情

        int Count;
        foreach(String i in Languages)
        {
            LangComboBox.Items.Add(Languages[Count]);
            Count++;
        }
        

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 2023-03-30
        • 2021-06-18
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多