2013-11-21 2 views
2

Я попытался динамически добавлять панели и их обработчики событий, используя приведенный ниже код.Динамически добавлять элементы управления и обработчики событий C#

Однако он не работает (вызывает событие при нажатии), хотя он похож на многие из доступных ответов.

Пожалуйста, помогите, если это возможно.

int items = 0; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    ArrayList al = new ArrayList(); 

    foreach (KnownColor knowColor in Enum.GetValues(typeof(KnownColor))) 
    { 
     Color color = Color.FromKnownColor(knowColor); 
     al.Add(color.Name); 
    } 

    foreach (string i in al) 
    { 
     addListItem(i); 
    } 
} 

public void addListItem(string item) 
{ 
    Panel pnlItem = new Panel(); 

    pnlItem.Location = new Point(0, items * 25); 
    pnlItem.Name = "pnl" + item; 
    pnlItem.Size = new Size(250, 25); 
    pnlList.Controls.Add(pnlItem); 

    Label lbl = new Label(); 
    lbl.Text = item; 
    pnlItem.Controls.Add(lbl); 

    pnlItem.MouseClick += new MouseEventHandler(pnlItem_MouseClick); 

    items++; 
} 

void pnlItem_MouseClick(object sender, MouseEventArgs e) 
{ 
    MessageBox.Show("panel was clicked"); 
} 
+1

Нет. Это нормально. Они могут содержаться внутри других элементов управления. – ispiro

+0

, так как я могу заставить это работать, потому что все выглядит отлично, но это не вызывает событие. – thewikus

+0

Вы щелкаете по самой панели или этикетке внутри панели? – Icemanind

ответ

2

Вы нажимаете на этикетку. Добавьте этот обработчик тоже:

pnlItem.MouseClick += pnlItem_MouseClick; 
lbl.MouseClick += pnlItem_MouseClick; 
0

Да, вы либо щелкаете по этикетке, либо не имеете никакой части панели. Я пробовал код, он работает, но делайте то, что сказали другие, и добавляйте задний цвет, чтобы вы знали, где нажать. Имейте в виду, что области вокруг метки могут также регистрироваться как «метка», даже если кажется, что вы нажимаете на панель (особенно непосредственно под ней).

Смежные вопросы