Je reçois une erreur d'exécution qui me dit qu'il est impossible de lancer un objet de type Imagebox pour taper MusicNote (MusicNote hérités de Picturebox.)
MusicNote mn = new MusicNote(mk.getMusicNote(), duration, bNoteShape, mk.getNote()); mn.MouseDown += new MouseEventHandler(Note_MouseDown); mn.MouseUp += new MouseEventHandler(Note_MouseUp); mn.MouseClick += new MouseEventHandler(Note_MouseClick); panel2.Controls.Add(mn); //adding MusicNote component to MusicStaff (panel2) collection
5 Réponses :
Cette erreur se produit lorsque panneau2.Controls code> contient les commandes code> non seulement du type
musicnote code> ou
imagebox code>. Depuis vos données, il n'est pas clair Quel est le type de tous
panneau2.Controls code>, doit être uniquement code> Collection code> ou
Liste code> des boîtes d'images. Si
panneau2.controls code> contient tout
Contrôle code> d'un type différent de
Imagebox code> ou
MusicNote code> (par exemple,
textbox , etc.), vous obtenez l'erreur. Si les types de tous
panneau2.controls code> sont corrects, le plus probablement le panneau
code> n'est pas complètement chargé lorsque l'erreur se produit.
Vous pouvez essayer:
foreach (var mn in panel2.Controls)
if (sender == (MusicNote)mn)
On dirait que vous essayez de jeter les commandes code> Collection i> à un
musicnote code> - Je ne pense pas que cela fonctionnera.
@Codigo Mieux vous modifier MusicNote Code> à
Contrôle CODE> dans la boucle de Forache et saisissez le
MusicNote Code> avec une condition IF dans la boucle.
en boucle sur MusicNote Code> Les instances uniquement, vous pouvez utiliser la méthode de l'extension
de type code> de LINQ:
foreach (MusicNote mn in panel2.Controls.OfType<MusicNote>()) {
// do stuff
}
Exactement ce que je cherchais. Merci beaucoup!
Cette erreur se présente à chaque fois que le Vous pouvez éviter cela en boucle Tous Exemple code: P> foreach (MusicNote Mn dans Panel2.Controls) CODE> LOOP TROUVER ALORS ALL ALLA a
MusicNote code>.
contrôles code> comme
foreach (contrôle CNTRL dans Panel2.Controls) CODE> P>
foreach (Control cntrl in panel2.Controls)
{
if(cntrl is MusicNote)
{
//do something with the MusicNote Control
}
}
Lorsque votre programme obtient le contrôle dans un gestionnaire d'événements comme Essayez quelque chose comme ceci: P> note_mousedown code> Vous recevez une référence à la commande "a pris" l'événement dans l'interface utilisateur (
adolescent d'objet code>). Essayez de caster le
Sender Code> à
MusicNote Code> à l'aide de la clause
comme code>. Si la distribution n'est pas possible (car
expéditeur code> est autre chose que
musicnote code>) L'utilisation de la clause
comme code> n'est pas une exception - à la place Il suffit de vous faire une référence nulle, que vous pouvez tester. P>
private void Note_MouseDown(object sender, MouseEventArgs e)
{
var mn = sender as MusicNote;
if (mn != null)
{
if (e.Button == MouseButtons.Right)
{
count = 0;
mn.timer1.Start();
sp.SoundLocation = MusicNote_path + mn.note + ".wav";
sp.Play();
}
if (e.Button == MouseButtons.Left)
{
dragging = true;
mn.BackColor = Color.HotPink;
}
}
}
J'utiliserais probablement simplement un casting - si l'événement ne signifie que vous devez être abonné au musicnote code>, puis si la distribution échoue, cela indique un bogue et une exception est entièrement raisonnable à ce stade. Mais je conviens qu'il n'y a pas besoin d'utiliser une boucle de forach. (Le OP utilise déjà l'expéditeur
code> dans la comparaison, il n'est donc pas clair pourquoi ils sont en boucle du tout.)
Il existe de nombreuses façons de résoudre votre problème, mais faisons simplement une procédure à suivre de votre code afin que vous puissiez voir à quel point il est maladroit. En anglais clair, vous faites ceci:
Le bouton de la souris est enfoncé sur une commande. Quel contrôle? Eh bien le contrôle dans
expéditeur code>. Vous en boucle à travers toutes les commandes dans
panneau2 code> pour voir si l'un d'entre eux est l'expéditeur code> code>, puis vous faites du travail. p> blockQuote>
Mais pourquoi boucleriez-vous à travers toutes les commandes dans
panneau2 code>? Lorsque vous avez créé le contrôle
MUSICNOTE CODE>, vous avez créé ce gestionnaire d'événement spécifiquement pour ce contrôle pour vous informer lorsque la souris est sur elle. Et maintenant, le contrôle augmente un événement et disant "hey, le bouton de la souris est en panne et que c'est sur moi!" Vous voyez, même si
panneau2.controls.oftype
() code> va réparer votre problème, mais pourquoi feriez-vous cela? Il semble être un XY Problème . P> Le seul Raison que vous feriez ce que vous faites est si vous avez créé le contrôle, souscrit à l'événement code> MouseDown CODE>, puis déplacés par programmation le contrôle d'un panneau à un autre et que vous ne voulez que faire du travail si le contrôle se produit. être dans
panneau2 code> lorsque la souris est en panne. Je doute que tu l'as déménagé; et même si vous l'avez fait, il existe de meilleurs moyens de gérer ce scénario. P>
solution appropriée forte> p>
Vous n'avez pas besoin d'une boucle et tout ce dont vous avez besoin est ce : p>
xxx pré> p>
Pouvez-vous poster l'erreur?
Peut-être qu'il y a d'autres choses que celle de MusicNote dans cette liste de contrôles?
@MariomitterBauer image ajoutée, vous pouvez le visualiser au bas de la question
@Pmf je ne sais pas ce que tu veux dire?
MusicNote Code> est plus spécifique que
Imagesbox Image> Vous ne pouvez donc pas lancer un
Imagebox Code> à un
MusicNote code> car pas tous les
Imagesbox code> est un
musicnote code>. Vous pouvez lancer l'inverse de
musicnote code> à
imagebox code>. Chaque chien est un animal mais chaque animal n'est pas un chien.
@LukeXuereb Le panneau est plein de boîtes d'images, n'est-ce pas? Au lieu de cette picture, vous devez ajouter le
musicnote code>.
@Codingyoshi mais je ne crois pas jamais jeter une boîte à images dans une note de musique.
Pouvez-vous partager le code qui remplit le panneau?
C'est ce que dit l'erreur. Les commandes dans
panneau2 code> ne sont pas tous
musicnote code> donc lorsque vous en boucle et que vous faites
MusicNote Mn dans Panel2.Controls Code> Vous êtes implicitement moulée.
@Joshknack fait.
@CODINGYOSHI Ainsi, afin d'exécuter une boucle foreach pour les notes de musique, le panel2.Controls doit être constitué uniquement de notes de musique?
Pourquoi avez-vous besoin de la boucle code> foreach code>?
@Davidtansey sans la boucle de Foreach Comment le programme peut-il distinguer les attributs d'une note de musique d'un autre?