2009-05-07 12 views
1

Si je fais pas créer un élément de menu "Edition-> Copier" et lui attribuer les touches de raccourci "CTRL + C", puis je peux sélectionner un contrôle (RichTextBox, DataGridView, etc.) et appuyez sur "CTRL +" C "et le contrôle lui-même va gérer la copie. Je peux copier le texte, et le coller dans le bloc-notes, etc.Comment gérer la copie pour plusieurs contrôles lors de l'ajout d'un raccourci clavier à un élément de menu?

Maintenant dans tout mon formulaire, j'ai beaucoup de contrôles. Mais j'ai un contrôle personnalisé que je veux préciser que je gère les fonctionnalités de copie pour. J'ai donc ajouté le raccourci CTRL + C à Edition-> Copier, et par défaut il est défini sur Activé.

Maintenant, je dois implémenter un gestionnaire d'événement pour l'événement 'click' sur cet élément de menu. Si je mets explicitement dans le code pour gérer la copie, il fonctionne:

public void menuEditCopy_Click(object sender, EventArgs e) 
{ 
    myCustomControl.Copy(); 
} 

Cependant, maintenant copie ne fonctionne pas sur tout autre type de contrôle. Ma première envie était de trouver le type de contrôle qui a le focus, et mettre en œuvre un ensemble limité de code de copie pour chacun d'eux:

public void menuEditCopy_Click(object sender, EventArgs e) 
{ 
    if (this.ActiveControl is MyCustomControl) 
    { 
     ((MyCustomControl)this.ActiveControl).Copy(); 
    } 
    else if (this.ActiveControl is RichTextBox) 
    { 
     ((RichTextBox)this.ActiveControl).Copy(); 
    } 
} 

etc ...

Cependant, mes contrôles sont ajoutés à un SplitContainer et le débogage montrent que this.ActiveControl est défini sur l'instance splitcontainer, pas sur le contrôle, même si je sais que le contrôle est sélectionné. Donc, ma dernière pensée

est de vérifier littéralement si chaque contrôle a le focus:

public void menuEditCopy_Click(object sender, EventArgs e) 
{ 
    if (myCustomControl.Focused) 
    { 
     myCustomControl.Copy(); 
    } 
    else if (richTextBox1.Focused) 
    { 
     richTextBox1.Copy(); 
    } 
} 

Je voudrais éviter cela si possible, il est beaucoup de contrôles, et si j'ajoute un nouveau contrôle, je aurait besoin de le mettre à jour. Existe-t-il une meilleure façon de le faire?

Merci

Répondre

3

A SplitContainer met en œuvre ContainerControl, de sorte que vous pouvez vérifier un ou l'autre et chercher à la place est ActiveControl. ContainerControl est la classe de base, donc je pencherais pour cela - vous pourriez attraper un autre type de conteneur ainsi:

private void DoCopy(Control control) 
{ 
    if(control is ContainerControl) 
     DoCopy(control.SelectedControl); 
    else if(control is MyCustomControl) 
     ((MyCustomControl)control).Copy(); 
    else if(control is RichTextBox) 
     ((RichTextBox)control).Copy(); 
    else 
     throw new NotSupportedException("The selected control can't copy!"); 
} 

void menuEditCopy_Click(object sender, EventArgs e) 
{ 
    DoCopy(this.ActiveControl); 
} 
0

Vous pouvez essayer settting la propriété KeyPreview de votre formulaire à true. Ensuite, vous pouvez configurer un gestionnaire pour l'événement KeyDown du formulaire qui ressemblerait à ce qui suit:

private void Form_KeyDown(object sender, KeyEventArgs e) 
{ 
    if(e.Modifiers == Keys.Control && e.KeyCode == Keys.C) 
    { 
     if (ActiveControl.GetType() == typeof(MyCustomControl)) 
     { 
      ((MyCustomControl)ActiveControl).Copy(); 
      e.Handled = true; 
     } 
    } 
} 

Ici, vous indiquez que vous avez traité l'événement Ctrl-C en définissant les args événement Handled propriété sur true. Sinon, si vous le laissez comme faux, la touche Ctrl-C sera manipulée comme d'habitude par chaque contrôle individuel. Parce que nous avons défini KeyPreview sur true, le gestionnaire du formulaire peut voir chaque touche enfoncée avant tout autre contrôle qu'il contient et peut décider de manipuler la touche elle-même ou bien de la manipuler de la même manière que si le formulaire ne l'avait jamais prévisualisé.

Je pense aussi qu'il serait nécessaire de supprimer la touche de raccourci de votre élément de menu (bien que vous puissiez toujours mettre manuellement le texte "Ctrl + C" à côté de votre nom d'élément de menu) pour que cela fonctionne votre élément de menu détournera le coup de clé.

Questions connexes