ComboBox在显示新值时保留旧值

时间:2018-05-20 18:15:51

标签: c# .net winforms

所以,自从我开始在这里挣扎已经4个小时了。

看,我有这个comboBox,并且它绑定到List<>, - 加载得像它应该的那样;但是在这里我还有一个textBox,它应该包含List<>的过滤条件的文本。很好,将所有过滤的项目打包到一个新列表中,comboBox显示它...但是当我选择从中选择一个项目,即comboBox.Item时,它返回第一个list中的项目。是的,第一个列表,显示过滤后的list的值;这些值是我稍后将打包成dataGridView的类对象。

这是TextChanged

    private void textBox4_TextChanged_1(object sender, EventArgs e)
    {
        IEnumerable<artikal> filtered =
            from artikal in art
            where artikal.naziv.ToUpper().Contains(textBox4.Text.ToUpper()) || artikal.plu.Contains(textBox4.Text) || artikal.barkod.Contains(textBox4.Text)
            select artikal;
        comboBox1.DataSource = null;
        comboBox1.Items.Clear();
        List<artikal> filter = filtered.ToList<artikal>();
        comboBox1.DataSource = filter;

这是班级,我的意思是,如果它很重要,但我不相信它是:

public class artikal
    {
        public string plu { get; set; }
        public string naziv { get; set; }
        public string kolicina { get; set; }
        public string nabavnaCena { get; set; }
        public string prodajnaCnea { get; set; }
        public string barkod { get; set; }
        public override string ToString()
        {
            return plu + " " + naziv;
        }
    }

art列表是一个全球列表,定义在世界世界之上。以下是我填充gridview的方法:

public partial class NabavkaFrm : Form
{
    #region some stuff lying here

    List<item> art = new List<item>();
    // other code
    row.Cells[0].Value = art[comboBox1.SelectedIndex].plu;
    row.Cells[1].Value = art[comboBox1.SelectedIndex].naziv;
}

所以,是的,有什么建议吗?每个路过的人都过得很开心:D

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的,问题不在您过滤项目的代码中。它不可能是。问题就在这里:

row.Cells[0].Value = art[comboBox1.SelectedIndex].plu;
row.Cells[1].Value = art[comboBox1.SelectedIndex].naziv;

并且因为art是类级别字段,如果组合框中的项目为0,它将始终在art中的索引0处显示项目。你不想要这个。您希望从筛选列表中显示索引0处的项目,但该列表会不断更改。有时,索引0处的项目是一回事,而另一项则是另一回事。

请改为:

var selectedItem = (comboBox1.SelectedValue as item);
row.Cells[0].Value = selectedItem.plu;