Детали окружающей среды:
Я создал специальную форму под названием 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
.
@FeiXu Это просто пространство имен. Это не мой код, и, вероятно, он не нуждался в цензуре, но я решил, что тоже могу. Два [отредактировано].util представляют собой одно пространство имен, а остальные [отредактировано] — другое.
Мне нужно было добавить общедоступный флаг к методу инициализатора, иначе генератор кода дизайнера не смог бы получить к нему доступ.
Добавление:
public WeatherYearBox()
исправил проблему.
Что такое [отредактировано]? Можете ли вы добавить это в свой пост?