为什么我的设计器生成的代码 (InitializeComponent()) 没有为我的自定义控件生成对象实例化行?

问题描述 投票:0回答:1

环境详情:

  • .NET 4.8
  • Visual Studio 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
时,设计器代码生成器仍然损坏。

c# visual-studio-2022 windows-forms-designer .net-4.8 visual-studio-designer
1个回答
0
投票

我需要向初始化方法添加一个公共标志,否则设计器代码生成器无法访问它。

添加:

public WeatherYearBox()

解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.