Exception: le Paramètre n'est pas valide (sur l'adoption d'une nouvelle image pour un contrôle pictureBox)
J'avais déjà une image à l'intérieur de contrôle PictureBox, et maintenant je veux passer un nouveau.
Ce qui se passe, c'est que allpication Dispose (et j'ai attraper une exception: "Paramètre n'est pas valide").
C'est mon code:
using (Image img = Image.FromFile(open.FileName))
{
part.Picture = img;
pictureBox1.InitialImage = null;
pictureBox1.Image = img;
}
Ainsi, lorsque le code est en dehors de la méthode, il va streight à Displose du présent et du formulaire principal. J'attrape l'exception seulement sur la ligne où Form1 a été commencé. Sur ce point il n'y a pas de excpetions, afin que jamais.
Il doit être quelque chose de mal tandis que la pictureBox est de la peinture (à l'intérieur de la Peinture de l'événement), mais je ne suis pas surbsribed.
Je n'ai plus la moindre idée de comment salve de cette question. J'ai même essayé de l'utiliser pour effacer toutes les ressources (par l'appel de la collecte des ordures), mais rien ne semble fonctionner.
Une chose de plus: "partie" est une référence de la Liste, de sorte que lorsque je tente de Supprimer l'image actuelle (pour la remplacer par une neuve) j'ai eu une autre exception, comme:
"Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus".
N'cela a quelque chose à voir avec le 1er exception (lors de la nouvelle image n'est pas peinte dans pictureBox)?
Devrait
pictureBox1.Image = img;GC.
être pictureBox1.Image = img;
? Qu'est-ce que part
? Quelle est l'exception levée? Est-il une trace de la pile avec de l'exception?OriginalL'auteur Mitja Bonca | 2012-10-01
Vous devez vous connecter pour publier un commentaire.
Que Reed a noté, l'Image que vous êtes en tirant de l'ouvrir.Nom de fichier est en train d'être éliminés une fois que vous quittez l'aide de (). Votre picturebox est encore le référencement de cette image en mémoire, donc, quand il est disposé, vous perdez ce qui était stocké dans votre picturebox trop.
Ce que vous avez vraiment besoin est un exemplaire unique de l'image que vous êtes en tirant.
De cette façon, votre fichier sera débloqué dès que vous sortez de ce bloc, et vous garderez un exemplaire unique de votre image dans la picturebox.
PARFAIT! Je ne sais pas ce que je pensais, à titre de référence seulement à-dire une copie des données réelles. Donc, en cas de cession, tout est perdu! Thx ceux à nouveau.
Génial solution. A travaillé comme un charme. +1
OriginalL'auteur MadHenchbot
Le problème est que, une fois que ce code s'exécute,
pictureBox1.Image
fait référence à unImage
qui a été disposé.Si vous n'enroulez pas le
Image
création dans unusing
, il devrait corriger votre problème.Ce serait bien si elle n'est pas aussi utilisé dans
part.Picture
(quelle qu'elle soit)... Ne voulais pas le faire car il est stocké ailleurs, trop...🙂 vous êtes l'homme, mais j'ai encore une question, lisez mon prochain post.
Il existe déjà une image à l'intérieur de l'objet pictureBox. J'ai fait "jeter", par asigning Image de la propriété à la valeur null. Est-ce OK?
Serait préférable de stocker une référence à ce, céder le nouveau, puis appelez dispose() vous-même (si vous savez qu'il n'est pas utilisé ailleurs)
OriginalL'auteur Reed Copsey
Vous pouvez aussi faire quelque chose comme créer une méthode qui charge les photos et de les transmettre au Contrôle de l'Image par exemple c'est ce que j'utilise quand je veux charger une Image Ctrl
J'ai un formulaire windows avec 3 Images différentes que je veux charger mais je veux seulement montrer le code pour Un depuis que j'appelle la même méthode pour tous les 3 Contrôles d'Image
OriginalL'auteur MethodMan
Oui, cela fonctionne maintenant, mais étrange, j'aurais presque jure que j'ai essayé de cette façon.
Ok, pas de souci, juste que cela fonctionne.
Ce qui est troublant moi, c'est autre chose aussi, qui à mon avis est le même que celui de votre code, mais sa ne fonctionne pas, son nouveau essayer de Disposer de l'application (avec la même exception).
Ceci est un exemple de code:
Maintenant je passe une image dans une liste générique, et essayez d'attribuer une nouvelle image pour un contrôle pictureBox, mais, encore une fois comme je l'ai dit, une exception est levée (et l'application est terminée).
Pourquoi?
Using
bloc, l'instance est disposé immédiatement après votre code quitte le bloc, si oui ou non il a fait référence à certaines où ailleurs.Mais la partie.L'Image a déjà une image réelle asigned, il ne marche pas? Donc, il faut travailler. Ou je me trompe?
Le code de la partie".Image = img" seules les copies de l'image de référence, il n'est pas de cloner l'image. Ainsi, lorsque img obtient évacués à la fin de l'utilisation de{} bloc, la référence à l'image n'est plus valide, et le cadre.Photo contiendra une référence nulle.
OriginalL'auteur Mitja Bonca