You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForms中如何将List内类实例属性添加到ComboBox

问题分析与解决方案

嘿,我帮你梳理下代码里的问题,主要有两个核心点:Caj类的静态属性会导致所有茶实例共享数据,还有文件读取的循环逻辑完全错误,另外ComboBox添加项的语法也需要调整。咱们一步步修正:

1. 先修复Caj类的致命问题

你把所有属性都加了static修饰符,这意味着所有Caj实例共用同一套属性值——每次创建新的茶对象,都会把之前所有实例的属性覆盖掉,这完全不是你想要的“每个茶有自己数据”的效果。必须把所有static去掉:

class Caj 
{ 
    // 去掉static,让每个实例拥有独立的属性
    public string Nazev { get; set; } 
    public string ZemePuvodu { get; set; } 
    public string Detail { get; set; } 
    public string BarvaNalevu { get; set; } 
    public string Chut { get; set; } 
    public int Cena { get; set; } 
    public int DobaLouhovani { get; set; } 
    public int PocetLzicek { get; set; } 
    public string Nalevy { get; set; } 
    public int TeplotaVody { get; set; } 

    public Caj(string nazev, string zemePuvodu, string detail, string barvaNalevu, string chut, int cena, int dobaLouhovani, int pocetLzicek, string nalevy, int teplotaVody) 
    { 
        Nazev = nazev; 
        ZemePuvodu = zemePuvodu; 
        Detail = detail; 
        BarvaNalevu = barvaNalevu; 
        Chut = chut; 
        Cena = cena; 
        DobaLouhovani = dobaLouhovani; 
        PocetLzicek = pocetLzicek; 
        Nalevy = nalevy; 
        TeplotaVody = teplotaVody; 
    } 

    // 可选:重写ToString()方法,这样直接把Caj对象加到ComboBox里,也会显示茶的名称
    public override string ToString()
    {
        return Nazev;
    }
}

2. 修复Form加载时的文件读取与ComboBox逻辑

你原来的嵌套for循环有问题——里面的j变量没有递增,会导致无限循环卡死。而且读取文件的方式可以更简洁,用foreach遍历所有行就好:

private void Form1_Load(object sender, EventArgs e)
{
    if (File.Exists(cesta))
    {
        cbNazevCaje.Items.Clear();
        databaze.Clear(); // 先清空列表,避免重复加载数据

        // 直接读取文件所有行,然后逐行处理
        string[] vsechnyRadky = File.ReadAllLines(cesta, Encoding.UTF8);
        foreach (string radek in vsechnyRadky)
        {
            // 跳过空行,避免拆分时报错
            if (string.IsNullOrWhiteSpace(radek))
                continue;

            string[] cajData = radek.Split(';');
            // 加个判断,确保每行数据格式正确,避免索引越界
            if (cajData.Length != 10)
                continue;

            // 这里建议用int.TryParse代替Convert.ToInt32,避免格式错误崩溃
            if (!int.TryParse(cajData[5], out int cena) ||
                !int.TryParse(cajData[6], out int dobaLouhovani) ||
                !int.TryParse(cajData[7], out int pocetLzicek) ||
                !int.TryParse(cajData[9], out int teplotaVody))
            {
                continue; // 格式不对就跳过这行
            }

            Caj novyCaj = new Caj(
                cajData[0], 
                cajData[1], 
                cajData[2], 
                cajData[3], 
                cajData[4], 
                cena, 
                dobaLouhovani, 
                pocetLzicek, 
                cajData[8], 
                teplotaVody
            );

            databaze.Add(novyCaj);
            // 两种添加方式选一种:
            // 方式1:只添加茶的名称到ComboBox
            cbNazevCaje.Items.Add(novyCaj.Nazev);
            // 方式2:如果重写了ToString(),直接加Caj对象,后续选中时能直接拿到完整实例
            // cbNazevCaje.Items.Add(novyCaj);
        }
    }
}

额外小技巧

如果选择方式2(直接加Caj对象到ComboBox),后续用户选中某个茶时,可以直接获取完整的对象数据,不用再去列表里查找:

private void cbNazevCaje_SelectedIndexChanged(object sender, EventArgs e)
{
    // 检查选中的是不是Caj实例
    if (cbNazevCaje.SelectedItem is Caj vybranyCaj)
    {
        // 比如显示茶的味道
        MessageBox.Show($"Vybraný čaj má chuť: {vybranyCaj.Chut}");
        // 或者把其他属性填充到表单的文本框里
        // txtZemePuvodu.Text = vybranyCaj.ZemePuvodu;
    }
}

内容的提问来源于stack exchange,提问作者Matěj Zíka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:13:32