枚举结果列表以提供带文本的多个文本框时的InvalidOperationException

时间:2012-03-05 18:24:27

标签: c# winforms linq entity-framework linq-to-entities

我有一个包含许多文本框的数据输入表单,以及一些用户输入数据的下拉列表。当用户从下拉列表中选择“位置”时,他们可以单击表单顶部的按钮以根据该位置查看包含更多详细信息的弹出窗口。弹出窗口加载时数据成功自动化,但当用户尝试关闭弹出窗口并继续使用主窗体时,系统会发生未处理的异常.InvalidOperationException。特别出现错误是因为“我正在枚举的集合已被更改”。虽然我没有改变任何东西,但我觉得幕后工作正在发生,这是我的代码来检索数据:

        string postalCode;
        string phone1;
        string phone2;
        string supervisor;

        var ObjectContext = new ObjectContext();

        var qry = (from i in ObjectContext.TableLocation
                   where i.LocationName == LocationValue
                   select i).ToList();

        foreach (var data in qry)
        {
           postalCode = data.postalCode;
           phone1 = data.phoneNumber1;
           phone2 = data.phoneNumber2;
           supervisor = data.supervisor
        }

        txtPostalCode.Text = postalCode;
        txtPhone1.Text = Phone1;
        txtPhone2.Text = Phone2;
        txtSupervisor.Text = supervisor;

LocationValue链接到一个Public变量,父表单填充了位置下拉列表中选择的任何内容:

        public string CountyValue
        {
            get { return txtCountyName.Text; }
            set { txtCountyName.Text = value; }
        }

有没有更好的方法来枚举这个值列表并将它们提供给textbox.text?我已尽力解决此错误。

修改的 此外,我的所有数据库列都是Varchars,因此无需转换数据类型。

当我通过ClickOnce将我的应用部署到客户端PC时,我只会收到此错误。

2 个答案:

答案 0 :(得分:1)

从我看到的,该位置是单个值,并且不需要创建List。这意味着您可以避免迭代列表,而是执行此操作:

var ObjectContext = new ObjectContext();

    var details = ObjectContext.TableLocation
                    .First(x => x.LocationName == LocationValue)
                    .Select(x => 
                            new { 
                                PostalCode = x.postalCode,
                                Phone1 = x.phoneNumber1,
                                Phone2 = x.phoneNumber2,
                                Supervisor = x.supervisor
                            });

txtPostalCode.Text = details.PostalCode;
txtPhone1.Text = details.Phone1;
txtPhone2.Text = details.Phone2;
txtSupervisor.Text = details.Supervisor;

<强>增加: 同时检查此MSDN Reference,根据它,有几种情况,ShowDialog()可能抛出InvalidOperationException,它与LINQ-to-SQL或EF无关。 ADDED:从MSDN文章中可以看出:

  

当表单显示为模式对话框时,单击“关闭”   按钮(表单右上角带有X的按钮)   导致隐藏窗体并设置DialogResult属性   到DialogResult.Cancel。与非模态形式不同,Close方法是   当用户单击关闭表单时,.NET Framework不会调用   对话框的按钮或设置DialogResult属性的值。   相反,表单是隐藏的,可以再次显示而不创建   对话框的新实例。因为表单显示为对话框   框是隐藏而不是关闭,你必须调用Dispose方法   当您的申请不再需要表格时的表格。

答案 1 :(得分:0)

在收集迭代之前记住项目(.ToArray())

    var qry = (from i in ObjectContext.TableLocation.ToArray() 
               where i.LocationName == LocationValue 
               select i).ToList();