0
votes

Comment résoudre une "exception invalidextexception" en C #?

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


13 commentaires

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 est plus spécifique que Imagesbox Vous ne pouvez donc pas lancer un Imagebox à un MusicNote car pas tous les Imagesbox est un musicnote . Vous pouvez lancer l'inverse de musicnote à imagebox . 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 .


@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 ne sont pas tous musicnote donc lorsque vous en boucle et que vous faites MusicNote Mn dans Panel2.Controls 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 foreach ?


@Davidtansey sans la boucle de Foreach Comment le programme peut-il distinguer les attributs d'une note de musique d'un autre?


5 Réponses :


-1
votes

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)


2 commentaires

On dirait que vous essayez de jeter les commandes Collection à un musicnote - Je ne pense pas que cela fonctionnera.


@Codigo Mieux vous modifier MusicNote à Contrôle dans la boucle de Forache et saisissez le MusicNote avec une condition IF dans la boucle.



2
votes

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
} 


1 commentaires

Exactement ce que je cherchais. Merci beaucoup!



0
votes

Cette erreur se présente à chaque fois que le foreach (MusicNote Mn dans Panel2.Controls) CODE> LOOP TROUVER ALORS ALL ALLA a MusicNote code>.

Vous pouvez éviter cela en boucle Tous contrôles code> comme foreach (contrôle CNTRL dans Panel2.Controls) CODE> P>

Exemple code: P>

foreach (Control cntrl in panel2.Controls) 
            {
                if(cntrl is MusicNote)
                {
                     //do something with the MusicNote Control
                }
            }


0 commentaires

1
votes

Lorsque votre programme obtient le contrôle dans un gestionnaire d'événements comme 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>

Essayez quelque chose comme ceci: 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;
        }
    }
}


1 commentaires

J'utiliserais probablement simplement un casting - si l'événement ne signifie que vous devez être abonné au musicnote , 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 dans la comparaison, il n'est donc pas clair pourquoi ils sont en boucle du tout.)



0
votes

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 . Vous en boucle à travers toutes les commandes dans panneau2 pour voir si l'un d'entre eux est l'expéditeur , puis vous faites du travail.

Mais pourquoi boucleriez-vous à travers toutes les commandes dans panneau2 ? Lorsque vous avez créé le contrôle MUSICNOTE , 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 () va réparer votre problème, mais pourquoi feriez-vous cela? Il semble être un XY Problème .

Le seul Raison que vous feriez ce que vous faites est si vous avez créé le contrôle, souscrit à l'événement MouseDown , 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 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.

solution appropriée

Vous n'avez pas besoin d'une boucle et tout ce dont vous avez besoin est ce : xxx


0 commentaires