Ошибка конструктора C #

Я новичок в C #, извините, если я задам глупые вопросы ...

Вот моя проблема:

  • У меня есть класс «ProtocolTabPage», который наследуется от «TabPage».
  • У меня есть «ControlPanel», унаследованная от «Panel».
  • У меня есть ControlPanel, созданный моим ProtocolTabPage.
  • Оба моих класса находятся в пространстве имен «AutoTestProtocols.Interface».

В ProtocolTabPage [Design] у меня есть следующие ошибки:

«Переменная ProtocolPanel либо не объявлена, либо никогда не назначалась.

в System.ComponentModel.Design.Serialization.CodeDomSerializerBase.Error (диспетчер IDesignerSerializationManager, String exceptionText, String helpLink) в System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression в выражении System.DomSerializer Expression (IDesignagerSerializerManagerManagerManagerManagerManager) .Serialization.CodeDomSerializerBase.DeserializeExpression (менеджер IDesignerSerializationManager, имя строки, выражение CodeExpression) в System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement (менеджер IDesignerSerializationManager, оператор CodeStatement)

Хотя в моем ProtocolTabPage.Designer у меня есть

[...]
this.ProtocolPanel = new AutoTestProtocols.Interface.ControlPanel();
[...]
this.splitContainer1.Panel2.Controls.Add(this.ProtocolPanel);
[...]
this.ProtocolPanel.AutoScroll = true;
this.ProtocolPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.ProtocolPanel.Location = new System.Drawing.Point(0, 0);
this.ProtocolPanel.Name = "ProtocolPanel";
this.ProtocolPanel.Size = new System.Drawing.Size(696, 700);
this.ProtocolPanel.TabIndex = 0;
[...]
private AutoTestProtocols.Interface.ControlPanel ProtocolPanel;"

Что случилось ?


person Community    schedule 08.05.2009    source источник


Ответы (4)


На первый взгляд кажется, что вы пытаетесь использовать имя типа в качестве имени переменной, чего обычно следует избегать. В вашем экземпляре ProtocolPanel попробуйте:

ProtocolPanel myProtocolPanel = new AutoTestProtocols.Interface.ControlPanel();

Затем вы можете просто изменить все эти вызовы с «This.ProtocolPanel» на «myProtocolPanel».

person AllenG    schedule 08.05.2009
comment
... но ProtocolPanel является типом ControlPanel, он не упомянул тип ProtocolPanel в своем описании. :( - person STW; 16.08.2009
comment
Нет ничего технически неправильного в использовании имени типа в качестве имени поля / свойства. Эрик Липперт написал специально об этом, он называет это проблемой цвета. - person Ed S.; 24.11.2009

Вот мое предположение через 5 минут ... Стек вызовов, который вы видите, - это то, что вы получаете, когда .Net не знает, как сериализовать / десериализовать член класса gui.

Попробуйте следующее:

[Browsable(false)]
ProtocolPanel ProtocolPanel {get {...} set {...} }

Если это по-прежнему не работает, откройте resx для формы и щелкните раскрывающийся список «Строки» (тип). Нажмите «Другое» и посмотрите, есть ли там какие-либо данные двоичной сериализации, связанные с ProtocolPanel. Если да, удалите их.

person Jason D    schedule 24.11.2009

Полагаю, у меня была аналогичная проблема:
Ваш класс ProtocolPanel в своем конструкторе делает что-то, что не работает во время разработки. Например, вы читаете файл настроек, которого нет, и это вызывает исключение? Или вы активно сериализуете то, что не сериализуемо?

В моем конструкторе был код инициализации, который обращался к модели, которой не было во время разработки. Я ввел следующий код в путь к конструктору, который помог:

if (DesignMode || LicenseManager.UsageMode == LicenseUsageMode.Designtime)
{               
    return;   //in design mode do not initialize anything (accessing the model here may cause troubles)
}
person Marcel    schedule 19.08.2010

У меня была такая же ошибка, и я открыл файл * .resx. Строки содержат переменную String1 без значения. Я удалил это, и он принудительно сохранил и устранил проблему (используя Visual Studio 2010).

  1. В обозревателе решений разверните форму нарушения
  2. Дважды щелкните файл * .resx.
  3. Выберите строки из раскрывающегося списка
  4. Щелкните правой кнопкой мыши String1 и выберите Удалить.
  5. ОК, чтобы сохранить, затем закройте * .resx и снова откройте форму
person Dave Russell    schedule 10.04.2013