2017-08-28 4 views
0

J'ai un RichTextBox pour lequel j'ai créé une fonction "faire défiler les messages envoyés". Cela signifie que si l'utilisateur envoie (en appuyant sur Entrée) des messages (jusqu'à 20), l'utilisateur peut alors les faire défiler dans l'ordre en appuyant sur les flèches haut/bas du clavier. Cette partie fonctionne comme prévu. Le problème est: Je veux sélectionner tout le texte dans le RichTextBox après chaque flèche.RichTextBox sélectionne tout le texte après Flèche haut/bas

Voici mon code:

private void rtb_inputField_KeyDown(object sender, KeyEventArgs e) { 
     RichTextBox inputField = (RichTextBox)sender; 
     string userInput = inputField.Text.Trim(); 
     string[] clientScriptString = userInput.Split(' '); 
     string modifiedInput = string.Empty; 
     string macroString = string.Empty; 

     //Other code... 

     if (e.KeyData == Keys.Enter) { 
       //Other code.. 

       if ((client != null) && (client.Connected)) { 
        macroString = runInputThroughMacroDictionary(userInput); 
        sendInputToServer(macroString); //Sent message 
       } 


      addSentMessageToHistory(userInput); //Added sent message to history 
      e.Handled = true; 
      e.SuppressKeyPress = true; 
      hasUpBeenPressed = false; 
     } 

     if ((e.KeyData == Keys.Up) || (e.KeyData == Keys.Down)) { 
      scrollThroughSentMessages(e); 
      rtb_inputField.SelectAll(); 
     } 
    } 

    private void scrollThroughSentMessages(KeyEventArgs e) { 
     if (sentMessageHistory.Count > 0) { 
      if (e.KeyData == Keys.Up) { 
       if (!hasUpBeenPressed) { 
        scrollThroughMsgHist = sentMessageHistory.Count - 1; 
       } 
       else { 
        scrollThroughMsgHist--; 
        if (scrollThroughMsgHist < 0) { 
         scrollThroughMsgHist = sentMessageHistory.Count - 1; 
        } 
       } 
       hasUpBeenPressed = true; 
      } 
      if ((e.KeyData == Keys.Down) && (hasUpBeenPressed)) { 
       scrollThroughMsgHist++; 
       if ((scrollThroughMsgHist >= 20) || (scrollThroughMsgHist > (sentMessageHistory.Count - 1))) { 
        scrollThroughMsgHist = 0; 
       } 
      } 
      rtb_inputField.Text = sentMessageHistory[scrollThroughMsgHist]; 
     } 
    } 

    private void addSentMessageToHistory(string message) { 
     int currentAmountOfMessage = sentMessageHistory.Count; 

     if (!string.IsNullOrWhiteSpace(message)) { 
      if (currentAmountOfMessage == 0) { 
       sentMessageHistory.Add(message); 
      } 
      else { 
       if (sentMessageHistory[currentAmountOfMessage - 1] != message) { 
        if (currentAmountOfMessage == 20) { 
         sentMessageHistory.RemoveAt(0); 
        } 

        sentMessageHistory.Add(message); 
       } 
      } 
     } 
    } 

La première méthode fait tout un tas de choses. (J'ai supprimé une partie du code non pertinent.) Il ajoute le dernier message envoyé à sentMessageHistory (qui est une liste) via la troisième méthode. Il écoute également Up/Down et appelle la seconde méthode.

La deuxième méthode "fait défiler" chacune des entrées de la liste sentMessageHistory et l'écrit dans RichTextBox. Tout cela fonctionne bien.

Ce qui ne fonctionne pas est le rtb_inputField.SelectAll(); après l'exécution de la deuxième méthode.

Répondre

0

J'ai trouvé la solution. J'ajouté ce qui suit:

if ((e.KeyData == Keys.Up) || (e.KeyData == Keys.Down)) { 
    scrollThroughSentMessages(e); 
    e.Handled = true; 
    e.SuppressKeyPress = true; 
    rtb_inputField.SelectAll(); 
} 

Je ne sais pas ce que e.Handled et e.SupressKeyPress fait, mais il fonctionne. Alors maintenant mon code sélectionne avec succès le texte après "défiler dans l'histoire".