Есть много способов исправить вашу проблему, но давайте просто сделаем пошаговое руководство вашего кода, чтобы вы могли увидеть, насколько это неуклюже. Проще говоря, вы делаете это:
Кнопка мыши нажата на элементе управления. Какой контроль? Ну и контроль в sender
. Вы просматриваете все элементы управления в panel2
, чтобы увидеть, является ли один из них sender
, и затем вы выполняете некоторую работу.
Но почему бы вам перебрать все элементы управления в panel2
? Когда вы создали элемент управления MusicNote
, вы создали этот обработчик событий специально для этого элемента управления, чтобы информировать вас, когда на него нажата мышь. И теперь элемент управления вызывает событие и говорит: «Эй, кнопка мыши нажата, а она нажата на мне!» Видите ли, хотя panel2.Controls.OfType<MusicNote>()
исправит вашу проблему, но зачем вам это делать? Это похоже на проблему XY .
Единственная причина, по которой вы будете делать то, что делаете, - это если вы создали элемент управления, подписались на событие MouseDown
, а затем программно переместили элемент управления с одной панели на другую, и вы хотите выполнять какую-то работу только в том случае, если элемент управления выполнен находиться в panel2
, когда мышь не работает. Я сомневаюсь, что вы переместили это; и даже если бы вы это сделали, есть лучшие способы справиться с этим сценарием.
Правильное решение
Вам не нужен цикл, и все, что вам нужно, это:
private void Note_MouseDown(object sender, MouseEventArgs e)
{
// If neither right nor left is down, return immediately because nothing needs
// to be done.
if (!(e.Button == MouseButtons.Right || e.Button == MouseButtons.Left))
{
return;
}
// This should not fail, if it does, then ask yourself why have you created
// this handler for things which are not MusicNote.
MusicNote mn = (MusicNote)sender;
// Do some work below
if (e.Button == MouseButtons.Right)
{
count = 0;
timer1.Start();
sp.SoundLocation = MusicNote_path + mn.note + ".wav";
sp.Play();
}
if (e.Button == MouseButtons.Left)
{
dragging = true;
mn.BackColor = Color.HotPink;
}
}