Почему мой код, сгенерированный дизайнером (InitializeComponent()), не создает строку создания экземпляра объекта для моего пользовательского элемента управления?

Детали окружающей среды:

  • .NET 4.8
  • Визуальная Студия 2022
  • Интерфейс дизайнера (если он так на самом деле называется)

Я создал специальную форму под названием WeatherBox, которая наследуется от другой пользовательской формы MultiSelectComboBox. После создания проекта я могу выбрать элемент WeatherBox в окне панели инструментов и создать его в представлении дизайнера.

Однако, когда я создаю проект, после добавления WeatherBox в форму, он выдает ошибку, потому что код, сгенерированный дизайнером, не включает строку, создающую экземпляр пользовательского класса (как это обычно происходит, и это происходит с MultiSelectComboBox, который WeatherBox наследуется от ). Очевидно, я могу вручную исправить ошибку, реализовав создание экземпляра самостоятельно, но это было бы сложно делать каждый раз, когда я хотел бы создать новый WeatherBox.

Вот класс WeatherBox:

using [redacted].Util;
using [redacted].GUI.CustomizedControls;
using [redacted].GUI.CustomizedControls.MultiSelectComboBoxControl;
using System;
using System.Windows.Forms;

namespace [redacted].GUI.CustomizedControls.MultiSelectComboBoxControl.CustomMultiSelectComboBoxes
{
    public class WeatherBox : MultiSelectComboBox
    {
        WeatherBox() : base()
        {
            ListItemSelected += new System.EventHandler(WeatherYearBox_ListItemSelected);
        }

        private static void WeatherYearBox_ListItemSelected(object sender, EventArgs e)
        {
            try
            {
                CheckedListView CLV = (CheckedListView)sender;
                MultiSelectComboBox CMB = (MultiSelectComboBox)CLV.Tag;

                if (CMB.List.FocusedItem != null && CMB.List.FocusedItem.Text != "")
                {
                    CMB.close();
                    CMB.Tag = CMB.List.FocusedItem.Tag;
                    CMB.Items.Insert(0, CMB.List.FocusedItem.Text);
                    CMB.SelectedIndex = 0;
                }
                else
                    CMB.Tag = null;
            }
            catch (Exception ex)
            {
                Logger.logInfo(ex);
            }
        }
    }
}

MultiSelectComboBoxControl — довольно большой класс, поэтому я просто скопировал его экземпляр (не уверен, насколько это имеет отношение к проблеме):

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;
using [redacted].Util; 
using System.Text.RegularExpressions;
using System.Drawing;

namespace SERVM.MCFRED.GUI.CustomizedControls.MultiSelectComboBoxControl
{
    public class MultiSelectComboBox : ComboBox
    {
        public MultiSelectComboBox() : base()
        {
                contents.Owner = this;
                contents.searchbox.Tag = this;
                contents.searchBoxPic.Tag = true;
                popup = new Popup(contents);
                popup.Resizable = true;
                popup.Height = 500;
                popup.Tag = this;
                popup.LostFocus += new EventHandler(popup_LostFocus);
                popup.VisibleChanged += new EventHandler(popup_VisibleChanged);
                contents.resizeBox.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
                contents.resizeBox.MouseUp += new MouseEventHandler(pictureBox1_MouseUp);
                contents.resizeBox.MouseMove += new MouseEventHandler(pictureBox1_MouseMove);

                if (!isMultiSelectEnable)
                {
                }

                contents.checkedListView.Tag = popup;

                List = contents.checkedListView;
                List.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
                List.Click += new EventHandler(delegate { });

                SuspendLayout();
                Name = "MultiSelectComboBox";
                Size = new System.Drawing.Size(237, 23);
                DropDownHeight = 1;
                DropDownStyle = ComboBoxStyle.DropDownList;
                Click += new EventHandler(SortableDropDown_Click);
                MouseHover += new EventHandler(MultiSelectComboBox_MouseHover);
                MouseWheel += new MouseEventHandler(MultiSelectComboBox_MouseWheel);
                Layout += new LayoutEventHandler(MultiSelectComboBox_Layout);
                ResumeLayout(false);
            }
    }
}

Почти все здесь — это устаревший код, пожалуйста, простите за беспорядок.

Что касается кода, сгенерированного дизайнером: он генерирует следующие строки для обоих пользовательских элементов управления за пределами InitializeComponent():

private CustomizedControls.MultiSelectComboBoxControl.CustomMultiSelectComboBoxes.WeatherBox weatherBox1;
private CustomizedControls.MultiSelectComboBoxControl.MultiSelectComboBox multiSelectComboBox1;

Но внутри InitializeComponent() вверху он генерирует:

this.multiSelectComboBox1 = new [redacted].GUI.CustomizedControls.MultiSelectComboBoxControl.MultiSelectComboBox();

Но не генерирует то, что, как я предполагаю, должно:

this._weatherYearBox = new [redacted].GUI.CustomizedControls.MultiSelectComboBoxControl.CustomMultiSelectComboBoxes.WeatherBox();

Спасибо, что обратили внимание на мою проблему!

Я пробовал собирать, пересобирать и очищать решение в сочетании с перезапуском Visual Studio, а также удалять/добавлять подпись : base() после конструктора для WeatherBox (я скопировал ее, потому что увидел, что она присутствует в классе MultiSelectComboBox, который работало, но наличие или отсутствие : base() после конструктора, похоже, не имеет значения") - мне, вероятно, следует выяснить, что это значит. Сделаю после завершения этого поста.

Ни одно из этих решений не помогло. Генератор дизайнерского кода остается неработающим, когда я пытаюсь реализовать WeatherBox.

Что такое [отредактировано]? Можете ли вы добавить это в свой пост?

Fei Xu 15.07.2024 04:50

@FeiXu Это просто пространство имен. Это не мой код, и, вероятно, он не нуждался в цензуре, но я решил, что тоже могу. Два [отредактировано].util представляют собой одно пространство имен, а остальные [отредактировано] — другое.

when-cowz-fly 15.07.2024 13:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне нужно было добавить общедоступный флаг к методу инициализатора, иначе генератор кода дизайнера не смог бы получить к нему доступ.

Добавление:

public WeatherYearBox()

исправил проблему.

Другие вопросы по теме