2010-11-04 9 views
1

J'ai un formulaire avec une zone de texte dessus. Je crée un objet BindingSource, connecte mon objet DomainObject, puis lie BindingSource à un TextBox. Le code ressemble à ceci:Comment puis-je savoir quand la liaison définit la zone de texte par rapport à l'utilisateur?

private BindingSource bndSource = new BindingSource(); 

private void Form1_Load(object sender, EventArgs e) { 
    bndProposal.DataSource = new DomainObject() { ClientCode = "123", EdiCode = "456" }; 
    txtAgencyClientCode.DataBindings.Add("Text", bndProposal, "ClientCode", 
           false, DataSourceUpdateMode.OnPropertyChanged, null); 

} 

private void txtAgencyClientCode_TextChanged(object sender, EventArgs e) 
{ 
    Debug.WriteLine("txtAgencyClientCode_TextChanged"); 
} 

public class DomainObject 
{ 
    public string ClientCode { get; set; } 
    public string EdiCode { get; set; } 
} 

Le code fonctionne bien. Cependant, j'aimerais connaître la raison pour laquelle l'événement TextChanged se déclenche: est-ce parce qu'il est défini par BindingSource ou est-ce parce que l'utilisateur a saisi quelque chose (ou l'a collé). Comment puis-je obtenir cette information?

J'ai essayé d'avoir un drapeau qui est défini lors de la création des liaisons, mais au moment de la liaison, la zone de texte est sur un contrôle de tabulation qui n'est pas visible. L'événement se déclenche lorsque je passe à l'onglet avec la zone de texte en question.

Répondre

1

Vous pouvez vous abonner à l'événement une fois le texte défini. Désactiver dans le concepteur et l'ajouter à la charge de forme:

private void Form1_Load(object sender, EventArgs e) { 
    txtAgencyClientCode.DataBindings.Add("Text", bndProposal, "ClientCode", 
           false, DataSourceUpdateMode.OnPropertyChanged, null); 
    txtAgencyClientCode.TextChanged += new System.EventHandler(txtAgencyClientCode_TextChanged); 

} 

Vous pouvez résilier votre abonnement avant chaque modification de texte programmatique si vous voulez être sûr:

txtAgencyClientCode.TextChanged -= txtAgencyClientCode_TextChanged; 
1

Y a-t-il une raison pour laquelle vous devez utiliser l'événement TextChanged pour l'entrée utilisateur? Pourriez-vous envisager d'utiliser un autre événement à la place, comme KeyPress? Tout dépend de ce que vous devez faire lorsque le texte change. L'autre option serait de comparer la valeur sur TextChanged avec le DataBoundItem.