环境详情:
我创建了一个名为
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
时,设计器代码生成器仍然损坏。
我需要向初始化方法添加一个公共标志,否则设计器代码生成器无法访问它。
添加:
public WeatherYearBox()
解决了问题。