2010-03-04 4 views
1

J'essaie de sauvegarder certaines mises en page à partir de Contrôles Grid DevExpress afin que les utilisateurs puissent modifier les mises en page et les recharger lors d'une utilisation ultérieure du contrôle.Événement de fermeture UserControl VB.Net dans Winforms

Ma question est la suivante pour les problèmes de vitesse Je charge le contrôle via un contrôle utilisateur à l'intérieur d'un formulaire. Maintenant, mon problème est que je crée le contrôle en ajoutant une instance du contrôle à un contrôle de panneau à l'intérieur d'un contrôle de groupe à onglets lorsque l'onglet est rendu visible, puis en effaçant le contrôle lorsque le contrôle est caché.

If ClaimsGridPanelControl.Visible = True Then 
      ClaimsGridPanelControl.Controls.Add(New RXClaimsGridControl(ClaimsBindingSource)) 
    Else 
      ClaimsGridPanelControl.Controls.Clear() 
    End If 

donc à l'intérieur de la RxClaimGridControl je besoin d'appeler une méthode SaveLayout quand je suis le contrôle de compensation. Mais il n'y a aucun événement, au moins que je peux trouver, qui se déclenche quand un contrôle d'utilisateur est enlevé/fermé/caché. Mes pensées pour gérer le .Clear() serait de déclencher un événement dans le contrôle parent, puis de gérer cet événement dans le contrôle de l'utilisateur.

Y at-il un événement qui me manque en ce qui concerne la suppression/fermeture/dissimulation d'un contrôle utilisateur, ou existe-t-il un meilleur moyen de le faire? Remplacez les méthodes Dispose ou OnHandleDestroyed de l'UserControl par les commandes

Répondre

2

+0

Je devais changer légèrement la façon dont je nettoyais les formulaires. Modifié du .Clear à un Pour Chaque qui a fait défiler tous les contrôles dans les panneaux Collection Collection et appelé disposer sur les contrôles. – msarchet

0

Je crois que vous appelez le SaveLayout() du mauvais endroit. La mise en page ne doit être enregistrée que lorsque des modifications sont apportées au DXGrid lui-même et n'a rien à voir avec le panneau.

Vous pouvez achive que par la manipulation du

GridView_ShowCustomizationForm 

Exemple de code

Private Sub GridView_ShowCustomizationForm(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GridView.ShowCustomizationForm 
    Dim gView As DevExpress.XtraGrid.Views.Grid.GridView = CType(sender, DevExpress.XtraGrid.Views.Grid.GridView) 
    AddHandler gView.CustomizationForm.FormClosing, AddressOf SaveGridSettings 
End Sub 

Private Sub SaveGridSettings() 

Grid.MainView.SaveLayoutToXml("c:\Settings.xml") 

End Sub 
+0

Ce serait le cas si l'utilisateur utilisait le formulaire de personnalisation pour personnaliser le contrôle de la grille. Cela gère le cas qu'ils l'ont personnalisé de toute façon, en faisant simplement glisser des colonnes autour, en utilisant une méthode de regroupement. C'est toutefois la façon dont je gère l'enregistrement d'un LayoutControl normal, car il fournit le cas où le contrôle n'est pas enregistré chaque fois qu'il s'ouvre et se ferme. Je suis d'accord qu'utiliser probablement le CustomizationForm comme méthode pour personnaliser la grille et ensuite utiliser seulement cet événement serait probablement un moyen plus efficace de le faire. – msarchet

+0

J'allais sur la base de ce que vous avez dit "J'essaye de sauver certaines mises en page de DevExpress Grid Controls ..." –

+0

Oui, je ne voulais pas entrer dans l'économie réelle de la disposition de la grille, car ce n'était pas le problème, il capturait lorsque le UserControl était "fermé" – msarchet

1

J'ai trouvé à http://lukhezo.com/2007/10/10/usercontrol-closing-event/

Protected Overloads Overrides Sub OnCreateControl() 

    MyBase.OnCreateControl() 

    AddHandler Me.ParentForm.FormClosing, AddressOf ParentForm_FormClosing 

End Sub 

Private Sub ParentForm_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) 

    If MessageBox.Show("Would you like to close the parent form?", "Close parent form?", _ 

         MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.No Then 

     e.Cancel = True 

    End If 

End Sub 

Vous pouvez ensuite appeler la client.Close() (ou quelle que soit l'action que vous désirez) au lieu de MessageBox.Show() dans l'événement ParentForm_FormClosing

Mon commentaire: Vous pouvez placer l'instruction AddHandler dans l'événement Load UserControl à la place.

Bien que cette question ait été posée il y a 5 ans, j'ai trouvé que cette solution était bonne.

Questions connexes