11
votes

C # Le contrôle des formulaires Windows de Windows ne conserve pas la valeur que si vous quittez le champ

J'ai vu la réponse dans DataNTound Le contrôle des formulaires Windows ne reconnaît pas le changement avant de perdre la mise au point em>.

Mais cela ne répond pas pleinement à la question pour moi. J'ai exactement la même situation. Sur Toolstrip_Click, je passe à travers toutes mes commandes et je force "Writevalue ()", mais il revient toujours à la valeur précédente avant la sauvegarde. Quelqu'un peut-il suggérer comment je peux résoudre ce problème? Ai-je implémenté cela mal? P>

(voir code de solution actuelle (non fonctionnelle).) P> xxx pré>

Le code est maintenant beaucoup plus simple, mais est un piratage considérable. Je serais très heureux de savoir s'il y a une solution plus "appropriée" pour cela. P>

private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    // Make sure that all text fields have updated by forcing everything
    // to lose focus except this lonely little label.
    label44.Focus();
}


0 commentaires

6 Réponses :


3
votes

Un outilstripboutton ne prend pas la mise au point lorsque vous avez cliqué sur. Vous pouvez ajouter un certain code à (temporairement) concentrer un autre contrôle. Vous pouvez concentrer une étiquette (comme un mannequin neutre).


2 commentaires

D'accord ... étonnamment, cela a fonctionné ... je vais volontiers vous donner le "up" pour cela. Mais je trouve que donner une mise au point sur une étiquette est un peu piraté. Je suis hésitant à marquer cela comme "la réponse suprême" à moins que personne d'autre n'a une idée plus lumineuse. Y a-t-il une façon "bonne" de faire la même chose?


Par exemple, si l'utilisateur utilise "Alt-S" pour enregistrer leur application? Aucun clic n'a jamais été officiellement donné.



0
votes

Essayez ceci:

private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    // Make sure that all items have updated databindings.
    foreach (Control C in this.Controls)
    {
        C.SuspendLayout();
        foreach (Binding b in C.DataBindings)
        {
            // Help: this doesn't seem to be working.
            b.WriteValue();
        }
        C.ResumeLayout();
    }
}


1 commentaires

Nan. = (Les champs ciblés sont toujours leurs valeurs précédentes.



3
votes

Qu'est-ce que tu liens? Si c'est un jeu de données, un jeu de données, etc., ou mieux encore, une liaison, vous devez appeler Endedit: xxx pré>

i implémente une interface iSave code> sur mes formulaires pour gérer Etat sale et sauvegarde et Chaque fois que STRUT> L'état sale est vérifié (chaque fois qu'IsDirty est appelé), j'ai toujours mis fin à ma source de liaison: p> xxx avant

avec ceci Interface, quand, par exemple, l'application se ferme, je peux facilement itérer via ma vérification des fenêtres ouvertes MDichild pour voir si des informations ont été enregistrées en casnant le formulaire enfant sur ISAVE CODE> et vérifiez la valeur de isdirty code>. J'appelle ici la source de liaison appropriée ou, le cas échéant, le contrôle de liaison (par exemple, une grille). P>

et pardonne la randonnée, mais je pensais que cela pourrait être utile. Le reste fonctionne comme: p>

Enregistrer () code> prend un paramètre de "force", afin que je puisse avoir un bouton "Enregistrer et fermer" un formulaire (enregistre un supplément Cliquez sur ou la confirmation demandant s'ils veulent enregistrer leurs modifications). Si la force est fausse, la méthode Enregistrer () code> est responsable de la demande de demander à l'utilisateur s'il veut enregistrer. Si c'est vrai, il est supposé que l'utilisateur a déjà décidé qu'ils veulent définitivement enregistrer leurs informations, et cette confirmation est ignorée. P>

Enregistrer () code> retourne bool- vrai si c'est prudent Continuez à exécuter le code d'appel (probablement un événement de formulaire). Dans ce cas, (si la force était fausse), étant donné une boîte de message YesNocancel, l'utilisateur a sélectionné oui kbd> ou no kbd> et que la sauvegarde elle-même n'a pas lancé une erreur. Ou, sauvegardez () code> renvoie false dans l'événement que l'utilisateur a choisi Annuler kbd> ou une erreur (en d'autres termes, indiquez au code d'appel d'annuler un formulaire de fermeture).

Comment gérer les erreurs dépend de vos conventions attrapantes à l'exception - cela pourrait être soit prise dans la méthode Save () code> et affichée à l'utilisateur ou peut-être dans un événement tel que la forme où e.cancel code> serait alors défini sur true. p>

utilisé avec un événement de fermeture de formulaire, il ressemblerait à ceci: P>

private void btnSaveAndClose_Click(object sender, EventArgs e)
{
     if (IsDirty)
        if (Save(true))
            Close();
}


0 commentaires

27
votes

Le problème est probablement que vos contrôles de données de banquets sont définis pour mettre à jour la validation.

Vous devez définir le DataSourceUpdateMode de chacun des commandes de données de données sur DataSourceptionUPDATemode.onpropertychanged. Par exemple, une zone de texte de données de banquets: xxx

Vous pouvez également définir le mode de mise à jour de DataSource dans le concepteur par:

Sélectionner le contrôle et aller à la propriété Fenêtre -> (Databindingings) -> (Advanced)

-> Définissez le [mode de mise à jour de la source de données] dans la liste déroulante sur ONPROPERTYCHANGED.

acclamations


2 commentaires

C'était exactement ça ... Vous ne savez pas combien de temps cette question m'a conduit. MERCI. Il semble si simple, en train de regarder en revue, mais tous les "experts", même de Microsoft, que j'ai demandé, ils ont même été abasourdis par celui-ci. BON TRAVAIL!


"Fenêtre de la propriété -> (DataildINDingings) -> (Advanced) ... Placez la ... dans la liste déroulante de la liste déroulante sur ONPROPERTYCHANGED ..." - OMG, je n'ai jamais su que c'était là! J'aimerais pouvoir vous voter un squillion Times Good Sir! :RÉ



0
votes

Cela m'a soulevé dans le passé. En plus du DataSourceUpdateMode étant réglé sur OnproperTychanged, la colonne sous-jacente de la source de données ne doit pas être en lecture seule.

Vérifiez-le pour votre colonne dans un jeu de données: p>

DataTable.Columns (" Nom de colonne "). Readonly code> p>

J'ai même fait une fonction qui définit toutes les colonnes à ne pas être réadonnée, qui est accompli plus d'une fois: p>

Public Function MakeReadOnlyFalse(ByVal dt As DataTable) As DataTable

    For Each col As DataColumn In dt.Columns
        If col.ReadOnly Then
            col.ReadOnly = False
        End If
    Next

    Return dt
End Function


0 commentaires

-1
votes

Pour moi c'est pire. Si je définis le mode source de mise à jour sur ONPROPERTYCHANGED sur ComboBox, il se comporte comme si j'avais défini ceci en mode ONVALIDATION! Les liaisons sont beaucoup plus meilleures dans WPF.


0 commentaires