Как инициализировать событие в настраиваемом элементе управления с помощью другого настраиваемого элемента управленияC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как инициализировать событие в настраиваемом элементе управления с помощью другого настраиваемого элемента управления

Сообщение Anonymous »

Добрый день всем.
Я пытаюсь создать собственный 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;
}
}
}
Из того, что я вижу, изначально при создании события «CustomComboBox_MouseClick» сообщается об 0 элементах управления, но я не знаю, почему.

Подробнее здесь: https://stackoverflow.com/questions/789 ... om-control
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»