Я читал и смотрел учебники по добавлению элементов управления во время компиляции, и я пытался реализовать их в своем коде, но не работает.Я проверяю это при отладке, но кажется, что элементы управления даже не добавляются в форму .
Это класс, который я хочу реализовать (класс Parents имеет класс List of Childно их не нужно показывать, потому что в отладке, которую я знаю, они распознаются. Heights и DefaultWidth являются статическими int в классе DropDownMenu)
[Serializable]
public class DropDownMenu
{
public Button AddButton(string title, int height)
{
Button btn = new Button();
btn.Text = title;
btn.Size = new Size(DefaultWidth,height);
return btn;
}
public FlowLayoutPanel AddDropDownLayoutPanel(int heightParent, int heightChilds, int numChilds)
{
FlowLayoutPanel flpDropDown = new FlowLayoutPanel
{
FlowDirection = FlowDirection.TopDown,
MinimumSize = new Size(DefaultWidth, heightParent),
MaximumSize = new Size(DefaultWidth, heightChilds*cantChilds)
};
return flpDropDown;
}
public FlowLayoutPanel AddDropDownButtons(int index, Point iniPos)
{
int numChilds = Parents[index].Childs.Count,
minSizeP = numChilds*HeightChild,
maxSizeP = minSizeP; //in this code I add more to this variable but right now is not really important
FlowLayoutPanel flpDropDownP = AddDropDownLayoutPanel(HeightParent, HeightChild, numChilds);
flpDropDownP.Location = iniPos;
flpDropDownP.Tag = 1;
flpDropDownP.Name = "flpParent" + index;
Button p = AddButton(Parents[index].title, HeightParent);
p.Name = String.Concat(isBtnParent, index);
p.Location = new Point(0,0);
p.Tag = 2;
flpDropDownP.Controls.Add(p);
flpDropDownP.MinimumSize = new Size(DefaultWidth, minSizeP);
flpDropDownP.MaximumSize = new Size(DefaultWidth, maxSizeP);
flpDropDownP.Size = flpDropDownP.MinimumSize;
return flpDropDownP;
}
}
И в форме, которую я вызываю для события загрузки:
private void FrmContainer_Load(object sender, EventArgs e)
{
DropDownMenu dropDownMenu = new DropDownMenu();
List<Parent> parents = new List<Parent>();
DropDownMenu.HeightParent = this.btnUsuario.Height;
DropDownMenu.HeightChild = this.btnUsuario.Height - 2;
try
{
List<Child> childs0 = new List<Child>
{
new Child{Id = "h0", Nombre = "Child 01"},
new Child{Id = "h1", Nombre = "Child 02"}
};
parents.Add(new Parent{ Id = "p0", Nombre = "Parent 01", Childs = childs0 });
parents.Add(new Parent{ Id = "p1", Nombre = "Parent 02", Childs= childs0 });
dropDownMenu.Parents = parents;
DropDownMenu.DefaultWidth = 128;
Point iniBtnMenu = new Point(10, 20); //I have other numbers, but isn't really important here
if (parents.Count != 0)
{
for (int index = 0; index < parents.Count; index++)
{
if (parents[index].Childs.Count != 0)
{
this.Controls.Add(dropDownMenu.AddDropDownButtons(index, iniBtnMenu));
}
else
{
Button n = dropDownMenu.AddButton(parents[index].Nombre, DropDownMenu.HeightParent);
n.Location = iniBtnMenu;
this.Controls.Add(n);
}
iniBtnMenu.X += DropDownMenu.DefaultWidth;
}
}
}
catch (Exception ex)
{
}
}
Я думаю, что они, возможно, создаются за другими элементами формы, но опять же в Visual Studio, когда я смотрю на элементы управления, добавленные в форму, кнопки не отображаются.нет, так что я полагаю, что это не проблема.Я использую Visual Studio 2013 (но я не думаю, что это как-то связано с этим).Сначала я просто создаю кнопку без размера, местоположения или имени, но когда я проверил на Form1.Designer.cs, все элементы управления имеют их, поэтому я добавил их.
Итак, что я хочуэто выпадающее меню, которое зависит от списка объектов (который позже я могу заменить некоторыми данными из базы данных) и его дочерних элементов (например, меню и подменю).И я не использую элемент управления по умолчанию из Visual Studio, потому что я хочу изменить дизайн, и я не могу с этим элементом управления.