10
votes

Impossible d'accéder à une erreur d'objet disposée

Je reçois le message d'erreur ne peut pas accéder à un objet disposé. Nom d'objet: 'ApplicationProperties'. Strong> Lorsque j'essaie de ré-ouvrir un formulaire après la fermeture. J'ai remarqué que cela provient de formulaires de sortie et de sortir est "disposer" fort> d'entre eux, j'ai donc mis le code suivant dans tous mes boutons d'acceptation et annuler les boutons (n'importe quel bouton qui ferme un formulaire) .

public partial class ApplicationProperties : Form
{
    //Creates and sets the instance MainBoxWindow.
    public MainBox MainBoxWindow { get; set; }


8 commentaires

Pouvez-vous montrer le code qui échoue dans la manière dont vous décrivez dans le Début de la question? C'est celui qui a vraiment besoin de fixation, plutôt que de votre tentative de pirater.


@Codygray J'ai mis à jour la question montrant où l'erreur tire.


Quel est le comportement souhaité? Vous essayez d'accéder à l'objet de l'applicationProperties que vous avez déjà éliminé, ou vous l'éliminez involontairement dans votre code quelque part. Initialisez un nouvel objet ApplicationProperties ou trouvez où vous vous disposez et supprimez le code si vous souhaitez que cet objet reste en mémoire. Vérifiez la définition de la classe ou faites une trouvatation sur le dispositif


J'essaie d'accéder à l'objet, et il est disposé lorsque je clique sur le bouton "x".


Je le réalise. Ce que je dis est, est-ce que vous voulez "vouloir" l'objet d'être disposé ou voulez-vous que cela persiste? Lorsque vous chargez le formulaire ApplicationProperties, utilisez-vous-le avec des valeurs stockées ailleurs? Ou disparaissent-ils lorsque l'utilisateur ferme le formulaire pour toujours, et c'est ok? La bonne réponse dépend de la manière dont vous souhaitez que l'application se comporte dans votre contexte. Vous pouvez vous débarrasser de la méthode Dispose par défaut comme solution rapide, mais cela signifie que l'objet persistera en mémoire jusqu'à ce que vous le disposiez manuellement ou que le parent se ferme.


Oh désolé a propos de ca. Il existe d'autres valeurs sauvegardées via ce formulaire sur un fichier .xml. Donc, je pense que si le cas échéant est d'être disposé que tout ira bien, et je pouvais simplement lâcher le fichier .xml chaque fois que le formulaire est ouvert. Aussi, j'ai cherché mon code de disposer et rien est venu.


Dans ce cas, cela irait probablement bien d'initialiser simplement un nouvel objet ApplicationsProperty chaque fois que vous souhaitez le recharger. Je spécule purement que vous essayez d'utiliser le même identifiant parce que je ne vois pas où vous initialisez le formulaire ci-dessus, mais si vous nous montrez cette partie de votre code, nous pouvons vous aider si vous n'êtes pas tout à fait sûr.


C'est ce que j'ai essayé de faire, j'ai essayé de mettre l'initialisation dans l'événement Button_primé pour ouvrir le formulaire, mais cela n'a pas fonctionné


4 Réponses :


6
votes

Essayez-ceci dans votre Formulant CODE> Evénement:

  private void ApplicationProperties_FormClosing(object sender, FormClosingEventArgs e)
  {
        //Hiding the window, because closing it makes the window unaccessible.
        this.Hide();
        this.Parent = null;
        e.Cancel = true; //hides the form, cancels closing event
   }


6 commentaires

Je l'ai donné, mais pas de chance.


Y a-t-il autre chose qui fonctionne que nous ne voyons pas?


Je me trompe peut-être, mais ne ferme pas la forme causant le problème? J'ai besoin de le cacher? Je ne suis pas sûr à 100% à ce sujet, mais c'est ce que je me faisais bien.


Je ne suis pas au courant de rien d'autre qui fonctionne. Je mettrai à jour la question avec quelques informations supplémentaires.


E.Cancel empêche le formulaire de la fermeture. Qu'est-ce que c'est.parent = null faire?


C'est le code de mon patron, j'essaie d'élargir son programme et, étant donné que cela travaillait sur les boutons, je l'ai transféré à la fonction de sortie. Si je le commente, cela ne fonctionne toujours pas.



3
votes

Tout d'abord, supprimer cela.parent = null bcose Ce n'est pas nécessaire lorsque vous cachez le formulaire

Maintenant, lorsque vous cachez le formulaire et si vous souhaitez toujours accéder à ce formulaire de boutique de formulaire dans STATIC VAR. BCOUS Lorsque l'objet n'est plus utilisé dans l'utilisation de la poubelle le disposer et il ne sera plus disponible.


8 commentaires

Comment vais-je aller à ce sujet?


Je réponds à cette question par mon téléphone portable. Alors s'il vous plaît considérer si je n'ai pas écrit actuellement


Comment stocker le formulaire dans un VaR statique?


Créez un VAR *** FORMULAIRE STATIQUE PUBLIQUE PUBLIC VOTREFORT; *** et ensuite référence votre formulaire à ce var


Cela est contrairement à l'instance que j'ai déjà compris entre les deux formes.


Créez une classe publique statique distincte et mettez ce Var dans cette classe ou si vous avez plus d'une forme, utilisez plus de var.


D'accord, je vais essayer ça.


D'accord . Cela fonctionnera correctement sinon. Demain quand j'utilise mon PC, je vais probablement vous expliquer et vous donner le code. Bonne chance



3
votes

Le problème, au moins peut-être en partie, ressemble à un peu d'interdépendance de classe.

Lorsque vous initialisez une instance ApplicationProperty , vous créez une référence à un objet MAINLOX , mais dans la définition de la catégorie MALEX BOX , vous créez une nouvelle référence Proporties , qui fait référence à un MAINLOX .... Je me déroude même. Est-ce que MAINLOX votre formulaire parent, celui qui chargeait lorsque vous démarrez l'application?

Je ne serais pas surpris si certaines choses dans MAINTOXBOX sont détruites par inadvertance si vous définissez une référence à celle-ci dans la classe CLASSPROPERITES Vous cliquez sur "x". Encore une fois, c'est une supposition éduquée; Je ne sais pas si c'est la raison, mais même si le code n'est pas mauvais en soi, ça a l'air bizarre pour moi.

Si vous souhaitez que votre ApplicationProperties Fenêtre pour durer éternellement et pour simplifier les choses, il suffit d'initialiser une instance statique de celui-ci au début de la forme qui va persister la durée de votre application et montrer / Cachez-le semblable à ce que vous essayiez à l'origine. Si vous voulez être efficace et fondamental, construire et éliminer ApplicationProperties Chaque fois que vous devez laisser l'utilisateur la modifier, mais tuez la dépendance circulaire.


0 commentaires

5
votes

Après je ferme le programme avec le bouton « x » sur la deuxième forme I ne peut pas form2 d'accès à nouveau à cause du message d'erreur au tir ApplicationPropertiesWindow.Show (); code> p>

Lorsqu'un formulaire est fermé ( Form.Close code> ), la forme elle-même et toutes ses ressources associées sont libérées. Il n'y a que deux exceptions à cette disposition automatique, comme il est indiqué dans la documentation: p>

  1. La forme fait partie d'une application MDI et pas em> visible. Li>
  2. Le formulaire a été affiché comme une boîte de dialogue modale en utilisant ShowDialog code> (par opposition à Afficher code>). Il est conçu de cette façon afin que vous puissiez accéder aux propriétés de la boîte de dialogue (par exemple pour récupérer l'entrée d'utilisateur) après que l'utilisateur a fermé il. Li> Ol>

    Dans ces deux cas particuliers, vous êtes responsable d'appeler manuellement la méthode Dispose code> du formulaire. Le deuxième cas est de loin le plus commun (n'utilise vraiment le paradigme de MDI plus), et est traitée facilement avec un en utilisant code> Déclaration: p>

    public class MyForm : Form
    {
        protected virtual void OnFormClosing(FormClosingEventArgs e)
        {
            // Prevent the form from closing.
            e.Cancel = true;
    
            // Hide it instead.
            this.Hide();
        }
    
        // ...other code in your form class
    }    
    


0 commentaires