Я пытаюсь создать собственный ComboBox. Я создал собственную кнопку раскрывающегося списка и использую ее в качестве кнопки раскрывающегося списка. После нажатия пользователем этой кнопки открывается панель, содержащая список элементов, которые можно выбрать (формат кнопки). Как только пользователь выбирает элемент, текст кнопки раскрывающегося списка должен измениться на текст выбранного элемента. Я знаю, что это базовая функциональность обычного поля со списком форм Windows, но я добавлю в это настраиваемое поле со списком некоторые функции, которые недоступны для обычного поля со списком форм Windows. У меня проблема в том, что обновление текста настраиваемой кнопки раскрывающегося списка происходит только после того, как я открыл панель, содержащую доступные элементы, закрыл ее и открыл еще раз. Я уверен, что я просто что-то простое. Будем признательны за некоторую помощь.
Код пользовательской кнопки раскрывающегося списка см. ниже:
Код: Выделить всё
namespace Example.CustomControls
{
public class DropdownCheckBox : CheckBox
{
private int initialWidth;
private string dropdownText;
private Icon dropdownIcon = Properties.Resources.DropDownArrow;
public string DropDownText
{
get { return dropdownText; }
set
{
dropdownText = value;
this.Text = value;
}
}
public DropdownCheckBox()
{
TextAlign = ContentAlignment.MiddleLeft;
Margin = new Padding(0);
Padding = new Padding(0);
FlatAppearance.BorderSize = 1;
FlatStyle = FlatStyle.Flat;
BackColor = SystemColors.Window;
Appearance = Appearance.Button;
FlatAppearance.MouseOverBackColor = SystemColors.Window;
FlatAppearance.MouseDownBackColor = SystemColors.Window;
initialWidth = this.Width;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Text = dropdownText;
this.AutoSize = false;
this.Height = 21;
Rectangle dropDownIconRectangle = new Rectangle(this.Width - this.Height + 2, 2, this.Height - 4, this.Height - 4);
e.Graphics.FillRectangle(new SolidBrush(SystemColors.Control), dropDownIconRectangle);
e.Graphics.DrawIcon(dropdownIcon, dropDownIconRectangle);
}
}
}
Ниже приведен код панели, которая создает кнопки для элементов:
Код: Выделить всё
namespace Example.CustomControls
{
public class ButtonsPanel : Panel
{
public bool createState = false;
public string selectedItemButtonText;
public string[] itemsList = new string[0];
public string[] ItemsList
{
get { return itemsList; }
set
{
this.Controls.Clear();
itemsList = value;
createState = true;
Refresh();
}
}
public ButtonsPanel()
{
Dock = DockStyle.Top;
Margin = new Padding(0);
Padding = new Padding(0);
BorderStyle = BorderStyle.FixedSingle;
BackColor = SystemColors.Window;
AutoScroll = true;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
this.Height = 5 * 21;
if (createState == true)
{
foreach (string item in itemsList.Reverse())
{
Button itemButton = new Button
{
Text = item,
Height = 21,
Dock = DockStyle.Top,
TextAlign = ContentAlignment.MiddleLeft,
Margin = new Padding(0),
Padding = new Padding(0),
FlatStyle = FlatStyle.Flat,
BackColor = SystemColors.Window,
};
itemButton.FlatAppearance.BorderSize = 0;
itemButton.FlatAppearance.MouseOverBackColor = SystemColors.Highlight;
itemButton.FlatAppearance.MouseDownBackColor = SystemColors.Highlight;
this.Controls.Add(itemButton);
}
foreach (Control itemButton in this.Controls)
{
itemButton.Click += ItemButton_Click;
}
createState = false;
}
}
private void ItemButton_Click(object sender, EventArgs e)
{
Button itemButton = (Button)sender;
selectedItemButtonText = itemButton.Text;
}
}
}
Код: Выделить всё
namespace Example.CustomControls
{
public class CustomComboBox : UserControl
{
private string dropdownCheckBoxText = "Select Items";
private string[] dropDownitemsList = new string[0];
private DropdownCheckBox dropdownCheckBox;
private ButtonsPanel dropdownPanel;
public string DropDownButtonText
{
get { return dropdownCheckBoxText; }
set
{
dropdownCheckBoxText = value;
dropdownCheckBox.DropDownText = value;
}
}
public string[] DropDownItemsArray
{
get { return dropDownitemsList; }
set
{
dropdownPanel.Controls.Clear();
dropDownitemsList = value;
dropdownPanel.itemsList = value;
dropdownPanel.createState = true;
Refresh();
}
}
public CustomComboBox()
{
dropdownCheckBox = new DropdownCheckBox()
{
DropDownText = dropdownCheckBoxText,
Dock = DockStyle.Top
};
dropdownPanel = new ButtonsPanel();
this.Controls.Add(dropdownCheckBox);
this.Controls.Add(dropdownPanel);
dropdownPanel.Visible = false;
dropdownCheckBox.CheckedChanged += DropDownCheckBox_CheckedChanged;
}
private void DropDownCheckBox_CheckedChanged(object sender, EventArgs e)
{
if (dropdownCheckBox.Checked == true)
{
Console.WriteLine("Eina");
this.Height = dropdownCheckBox.Height + dropdownPanel.Height;
dropdownPanel.Visible = true;
dropdownPanel.BringToFront();
foreach (Button itemButton in dropdownPanel.Controls)
{
itemButton.MouseClick += CustomComboBox_MouseClick;
}
}
else
{
this.Height = dropdownCheckBox.Height;
dropdownPanel.Visible = false;
dropdownPanel.SendToBack();
foreach (Button itemButton in dropdownPanel.Controls)
{
itemButton.MouseClick -= CustomComboBox_MouseClick;
}
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (dropdownCheckBox.Checked == true)
{
this.Height = dropdownCheckBox.Height + dropdownPanel.Height;
}
else
{
this.Height = dropdownCheckBox.Height;
}
}
private void CustomComboBox_MouseClick(object sender, MouseEventArgs e)
{
dropdownCheckBoxText = dropdownPanel.selectedItemButtonText; ;
dropdownCheckBox.DropDownText = dropdownPanel.selectedItemButtonText;
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/789 ... om-control