InvalidOperationException при перечислении через список результатов, чтобы обеспечить несколько текстовых полей с текстом - PullRequest
0 голосов
/ 05 марта 2012

У меня есть форма ввода данных со многими текстовыми полями и некоторыми раскрывающимися списками для ввода данных пользователем.Когда пользователь выбирает «Местоположение» из выпадающего списка, он может нажать кнопку в верхней части формы, чтобы просмотреть всплывающее окно с более подробной информацией в соответствии с этим местоположением.Данные успешно автоматизируются при загрузке всплывающего окна, но когда пользователь пытается закрыть всплывающее окно и продолжить работу с главной формой, возникает необработанное исключение для system.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?Я пытался все, чтобы исправить эту ошибку.

EDIT Также все мои столбцы базы данных являются Varchars, поэтому не было необходимости преобразовывать типы данных.

И я получаю только этоошибка при развертывании приложения через ClickOnce на клиентском ПК.

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Из того, что я вижу, это Location - одно значение, и нет необходимости создавать 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. ДОБАВЛЕНО: Из этой статьи MSDN сказано:

Когда форма отображается как модальное диалоговое окно, нажмите Закрыть кнопка (кнопка с крестиком в правом верхнем углу формы) вызывает скрытие формы и установку свойства DialogResult в DialogResult.Cancel. В отличие от немодальных форм, метод Close не вызывается .NET Framework, когда пользователь щелкает форму закрытия кнопка диалогового окна или задает значение свойства DialogResult. Вместо этого форма скрыта и может быть показана снова без создания новый экземпляр диалогового окна. Потому что форма отображается в виде диалога поле скрыто, а не закрыто, необходимо вызвать метод Dispose форма, когда форма больше не нужна вашему приложению.

0 голосов
/ 05 марта 2012

запоминание элементов (.ToArray ()) до итераций коллекции

    var qry = (from i in ObjectContext.TableLocation.ToArray() 
               where i.LocationName == LocationValue 
               select i).ToList(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...