2012-09-13 4 views
2

Je cherche à personnaliser un contrôle de zone de texte enrichi sur mon application Windows Form. La RichTextbox sera utilisée pour saisir les données de texte qui, une fois complétées, seront envoyées par SMS.c Remplacer la fonction de collage RichTextBox - Application Win Form

Les exigences sont que le texte ne peut pas avoir de ruptures de ligne car certains des anciens téléphones portables n'affiche pas les informations correctement et il perd son formatage. Ce que je dois être en mesure de faire est d'attraper les données du presse-papiers avant qu'il ne soit collé dans le RTB et de personnaliser sa mise en forme, par exemple supprimer les sauts de ligne.

J'ai trouvé un exemple ici qui a obtenu ce travail dans une certaine mesure, mais enlève pouvoir coller dans d'autres contrôles: -

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
       { 

         if((keyData == (Keys.Control | Keys.V))) 
         { 
         IDataObject iData = Clipboard.GetDataObject(); 

         if (iData.GetDataPresent(DataFormats.Text)) 
         { 
          string contents = Clipboard.GetText().Replace("\r\n", " "); 
          Clipboard.SetData(DataFormats.Text, contents); 
          richTextBox1.Paste(); 
         } 
          return true; 
         } 
         else 
         { 
         return base.ProcessCmdKey(ref msg, keyData); 
         } 
       } 

Est-ce que quelqu'un sait comment je devrais faire cela s'il vous plaît?

+0

En outre, ce code ne gérera pas les opérations de clic-droit. –

+0

Vous ne pouvez pas faire cela sur un formulaire Win, uniquement dans WPF. – Derek

Répondre

1

Vous devez hériter de RichTextBox et ajouter le traitement personnalisé comme vous l'avez décrit vous-même; vous pouvez également définir les données d'origine de nouveau dans le presse-papiers, pour être en mesure de le coller dans d'autres contrôles (sous la forme originale):

public class CustomRTB:RichTextBox 
    { 
     protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
     { 

      if ((keyData == (Keys.Control | Keys.V))) 
      { 
       IDataObject iData = Clipboard.GetDataObject(); 

       if (iData.GetDataPresent(DataFormats.Text)) 
       { 
        string contents = Clipboard.GetText(); 
        // string newText = *process text here* 
        Clipboard.SetData(DataFormats.Text, newText); 
        this.Paste(); 
        Clipboard.SetData(DataFormats.Text, contents); 
       } 
       return true; 
      } 
      else 
      { 
       return base.ProcessCmdKey(ref msg, keyData); 
      } 
     } 

    } 
+0

Des trucs géniaux. Merci! :-) – Derek

1

Essayez de capturer le texte tel qu'il change et la suppression des sauts de ligne:

private void richTextBox1_TextChanged(object sender, EventArgs e) 
    { 
     RichTextBox box = (RichTextBox)sender; 
     box.Text = box.Text.Replace(Environment.NewLine, string.Empty); 
     box.Text = box.Text.Replace("\n", string.Empty); 
     box.SelectionStart = box.TextLength; 
     box.ScrollToCaret(); 
    } 
Questions connexes