2010-03-24 9 views
1

J'ai une application WinForms (OwnerForm) avec un UserControl.Comment remplacer un événement sur un UserControl

Lorsque la zone de texte de UserControl est modifiée, je souhaite filtrer le contenu d'un PropertyForm.

Mais comment puis-je le faire? Je ne veux pas spécifier OwnerForm dans le contrôle utilisateur.

Je connais une solution pour ajouter manuellement des gestionnaires pour MyUserControl.tb.TextChanged à certaines fonctions sur un formulaire propriétaire, mais je pense que c'est mauvais. Je préférerais avoir des fonctions remplaçables, mais je ne peux pas imaginer comment le faire. Aucune suggestion?

Merci à l'avance,

Répondre

3

faire si votre usercontrol est faite à partir VB.NET, doivent gérer l'événement et rangerait à la consommation de votre commande:

Public Class FilterBox 

    <Browsable(True)> _ 
    Public Shadows Event TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) 


    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged 

     RaiseEvent TextChanged(sender, e) 

    End Sub 

End Class 

faire si votre usercontrol est fabriqué à partir de C#, juste rediriger l'événement TextChanged de votre zone de texte de usercontrol:

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 

namespace Craft 
{ 

    public partial class FilterBox : UserControl 
    { 
     public FilterBox() 
     { 
      InitializeComponent();    
     } 

     [Browsable(true)] 
     public new event EventHandler TextChanged 
     { 
      add 
      { 
       textBox1.TextChanged += value; 
      } 
      remove 
      { 
       textBox1.TextChanged -= value; 
      } 
     }//TextChanged "surfacer" :-) 

    }//FilterBox 
}//Craft 

consommation sage, FilterBox de VB.NET et C# Filterbox 's sont les mêmes. mais l'implémentation en C# est plus simple, il suffit de connecter directement l'événement du programmeur grand public à l'événement textbox1 d'usercontrol.

Je pense que le titre de l'article devrait être Defining Add and Remove Accessor Methods for Events in VB.NET: Vous voulez être l'envie de tous vos amis VB?

Comme vous pouvez le voir dans le code d'implémentation ci-dessus, C# a moins de temps d'exécution.

le code C# ci-dessus n'est pas possible en VB.NET: One might ask "why should I care?" Well, C# permits programmers to define their own add and remove subscription events. As a result a C# developer can extend the behavior of the add and remove subscription methods. One useful application of the add and remove handler is to surface an event on a constituent control

Note: à consommer événement a changé de la zone de texte de votre usercontrol. dans le concepteur VS, cliquez sur la boîte à outils Propriétés, cliquez sur l'icône d'événement (éclair), double-cliquez sur le TextChanged, ajoutez la logique nécessaire.

0

Vous pouvez remplacer seulement si vous étendez le TextBox. Vous devriez donc probablement enregistrer un gestionnaire dans la zone de texte (changement de texte) où vous effectuez votre filtrage.

+0

Pouvez-vous donner mon exemple ou un lien avec des explications s'il vous plaît? – Vadim

0

Vous pouvez fournir un contrôleur pour effectuer de telles opérations.

[Note: ce code est pseudo, vérifiez eventhandler pour TextChanged]

 

public interface IOperationController 
{ 
    bool DataChanged(string newData,string oldData); 
} 


public class YourControl:UserControl 
{ 
    private IOperationController_controller; 

    public void SetController(IOperationControllercontroller) 
    { 
    _operationController = controller; 
    } 

    private void OnTextChanged(object sender, TextChangedEventArgs e) 
    { 
    if(_operationController != null && _operationController.DataChanged(e.Value,textBox.Text)) 
    { 
    //perform your operation 
    } 
    } 
} 

public class OwnerForm:Form,IOperationController 
{ 
    public OwnerForm() 
    { 
    yourControlInstance.SetController(this) 
    } 
} 

 
1

Créer un événement FilterChanged dans UserControl qui ressuscitera événement TextChanged TextBox intérieur. Ensuite, vous l'aurez bien encapsulé.

+0

Si j'ai créé dans un UserControl un sous: Overridable Public Sub FilterParentForm() End Sub comment puis-je le remplacer dans un OwnerForm? Je veux écrire quelque chose comme Public Overrides Sub UserControl.FilterParentForm End Sub mais je ne peux pas. – Vadim

+0

si votre PropertyForm hérite UserControl, vous pouvez faire des remplacements de sous. remplacer le travail uniquement dans le contexte de l'héritage. Si vous faites glisser votre commande usercontrol vers ownerform, vous devez avoir un événement assignable dans votre commande usercontrol et ajouter un gestionnaire à cet événement, comme tous les autres contrôles de votre programme, par ex. TextChanged, KeyPress, Clic, etc. –

1

Surcharge (étend) la commande. Voyez si vous pouvez câbler un gestionnaire d'événement à l'événement Changed de la zone de texte. Si vous ne trouvez pas un événement comme celui-là, vérifiez s'il possède une fonction OnTextChanged que vous pouvez remplacer (son nom peut différer, mais la convention suivie par la plupart des contrôleurs est de rendre les fonctions On * virtuelles afin que les utilisateurs le contrôle peut l'ignorer). A défaut, lancez votre débogueur et partez en spéléologie. Recherchez les événements et/ou les fonctions mentionnés ci-dessus, puis devenez méchant avec un peu de réflexion pour les invoquer ou les accrocher.

Questions connexes