иногда я получаю System.ArgumentOutOfRangeException в BindingsCollection - PullRequest
1 голос
/ 15 января 2012

Иногда, когда я хочу показать пользовательский элемент управления и установить его привязки, я получаю исключение System.ArgumentOutOfRangeException. Когда я нажимаю «Продолжить», действие будет прервано, но при повторном выполнении этого действия пользовательский элемент управления отображается правильно. Я не могу воспроизвести проблему.

Я читал некоторые проблемы, в которых BingdinsCollection изменяется во время обновления. Но я не могу указать конкретный фрагмент кода в моем проекте. Может ли это иметь отношение к дескриптору окна?

************** Exception Text **************
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
   at System.Collections.ArrayList.get_Item(Int32 index)
   at System.Windows.Forms.BindingsCollection.get_Item(Int32 index)
   at System.Windows.Forms.Control.UpdateBindings()
   at System.Windows.Forms.Control.OnBindingContextChanged(EventArgs e)
   at System.Windows.Forms.ContainerControl.OnCreateControl()
   at System.Windows.Forms.UserControl.OnCreateControl()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e)
   at System.Windows.Forms.ScrollableControl.OnVisibleChanged(EventArgs e)
   at System.Windows.Forms.Control.SetVisibleCore(Boolean value)
   at System.Windows.Forms.Control.set_Visible(Boolean value)
   .. my click

Ответы [ 2 ]

0 голосов
/ 16 января 2012

Из трассировки стека исключений похоже, что вы изменяете видимость элемента управления, но привязанный к элементу ArrayList не имеет правильной записи для элемента управления.

Я бы попробовал изменить порядок, в котором вы выполняете свои действия. Например, если вы связываетесь, а затем показываете, я бы изменил этот процесс.

0 голосов
/ 16 января 2012

Вы устанавливаете BindingSource в другом потоке? Или делать что-нибудь в другом потоке, что может привести к изменению коллекции DataBindings во время ее перечисления?

Из исходного кода фреймворка, похоже, это единственный способ, которым это может произойти.

Из Control.cs

 private void UpdateBindings()
    {
      for (int index = 0; index < this.DataBindings.Count; ++index)
        BindingContext.UpdateBinding(this.BindingContext, ((BindingsCollection) this.DataBindings)[index]);
    }

Из BindingsCollection.cs

public Binding this[int index]
{
  get
  {
    return (Binding) this.List[index];
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...