c#集合修改未在所有WinForms中生效

本文关键字:WinForms 集合 修改 | 更新日期: 2023-09-27 18:28:08

我项目的主要形式是form 1。这实际上是在搜索"患者"窗口。它有一个组合框,里面装满了DB中现有患者的列表。这个组合框是用下面写的函数来归档的。此函数是从构造函数调用的。

    public void fillComboBox()
    {
        items.Clear();
        items.Add("Select Name");
        MainDataContext context = new MainDataContext(); //dotConnect Linq to sqlite
        var query = from p in context.Patients
                    orderby p.Name ascending
                    select p;
        foreach (Patient p in query)
        {
            items.Add(p.Name);
        }
        comboBox1.DataSource = items;
    }

(效果良好)。项的类型为"List<string>"。在创建每个新表单时,我传递form1的实例。像

Form3 f3=新Form3(this);

在找到患者后,控制转到Form3以显示患者信息或编辑(如果需要)(工作正常)。然后转到Form4,构建婴儿成长图表(效果良好)。添加新患者时会出现"问题"。控件通过"新建患者"按钮从Form1转到Form2。在Form2中,我添加了一名患者,然后转到Form3和Form4(效果良好)。在我完成Form4后,控制权转移到Form1,代码为

    Form1 f1;
    public Form4(Form1 f1)
    {            
        InitializeComponent(); //and etc
        this.f1 = f1;
    }
    //...other functions etc
    private void button4_Click(object sender, EventArgs e)
    {
        this.Close();
        f1.Show();
    }

但是Form1中的comboBox没有更新。它包含相同的旧列表。但当我在Form4中创建一个新的Form1时,就像这个

private void button4_Click(object sender, EventArgs e)
    {
        this.Close();
        Form1 form1 = new Form1();
        form1.Show();
    }

那么它工作得很好,但以这种方式。将显示Form1的一个实例,而隐藏另一个实例。并且如上所述,这个新Form1将创建它的子窗体(2,3,4)。我不想这样,所以我回到了以前的解决方案(转到Form1,而没有在Form4中创建新实例)。但这导致组合框(在Form1中)中没有更新,当我关闭程序时,它会给出错误。

集合已修改;枚举操作可能不会执行;

在Form4中也尝试过此代码

private void button4_Click(object sender, EventArgs e)
    {
        this.Close();
        f1.fillcombobox();
        f1.Show();
    }

我还试图覆盖Form1的onShown和onLoad事件,但没有收获,只是痛苦和徒劳。然后我尝试了

Application.Restart();

在插入患者后的Form2中。这确实帮了我一把。但这会导致另一个问题。控件转到Form1,我想在插入新患者后转到Form3。

请帮帮我。我知道这是一场混乱,但我们将感谢您的帮助:)

c#集合修改未在所有WinForms中生效

集合已修改;枚举操作可能不会执行;

此错误表明您正在枚举一个集合(可能是foreach),同时又在修改它。这是不允许的。您无法修改正在枚举的集合。

不过,您需要显示引发异常的行。

由于您使用的似乎是同一个列表实例(称为items),并且我猜它是一个list对象,因此当列表内容发生更改时,控件不会得到通知,因此数据不会在UI中刷新。

您是否尝试对项集合使用BindingList?看看这个例子

相关文章: