none
Добавление текста в Textbox RRS feed

  • Вопрос

  • Здравствуйте!!! нужно после каждого введенного слово в Textbox, к тексту добавлялся другой текст, вот код

     

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.TextChangedEventArgs) Handles TextBox1.TextChanged
      If TextBox1.Text = "яблоко" Then
       TextBox1.Text = TextBox1.Text + "вкусный фрукт"
      ElseIf TextBox1.Text = TextBox1.Text + "огурец" Then
       TextBox1.Text = TextBox1.Text + "вкусный овощ"
      End If
     End Sub
    
    но добавляется только первое слово, как можно изменить код?

     

    8 февраля 2011 г. 16:19

Ответы

  • Как вам такой вариант: 

        char[] sep; // массив разделителей
    
        public Form1()
        {
          InitializeComponent();
    
          sep = new[] { ' ', ',', '.', ';' };
          Array.Sort(sep);
        }
    
        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
          if (Array.BinarySearch(sep, e.KeyChar) >= 0)
          {
            int startLineCharIndex = textBox1.GetFirstCharIndexOfCurrentLine();
            int line = textBox1.GetLineFromCharIndex(startLineCharIndex);
    
            string text = textBox1.Lines[line].TrimEnd(sep);
            int ind = text.LastIndexOfAny(sep);
    
            string lastword = text.Substring(ind >= 0 ? ind : 0);
            label1.Text = "посл слово:" + lastword;
    
            if (lastword == "hello")
            {
              e.Handled = true;
    
              textBox1.SelectionStart = startLineCharIndex;
              textBox1.SelectionLength = textBox1.Lines[line].Length;
              textBox1.SelectedText += e.KeyChar + "world";
            }
          }
        }
    


    Для связи [mail]
    • Предложено в качестве ответа Andrew VIR 9 февраля 2011 г. 17:03
    • Помечено в качестве ответа Program-s.g 9 февраля 2011 г. 17:09
    9 февраля 2011 г. 8:45
  • Private sep As Char()
    ' массив разделителей
    Public Sub New()
    	InitializeComponent()
    
    	sep = New () {" "C, ","C, "."C, ";"C}
    	Array.Sort(sep)
    End Sub
    
    Private Sub textBox1_KeyPress(sender As Object, e As KeyPressEventArgs)
    	If Array.BinarySearch(sep, e.KeyChar) >= 0 Then
    		Dim startLineCharIndex As Integer = textBox1.GetFirstCharIndexOfCurrentLine()
    		Dim line As Integer = textBox1.GetLineFromCharIndex(startLineCharIndex)
    
    		Dim text As String = textBox1.Lines(line).TrimEnd(sep)
    		Dim ind As Integer = text.LastIndexOfAny(sep)
    
    		Dim lastword As String = text.Substring(If(ind >= 0, ind, 0))
    		label1.Text = "посл слово:" & lastword
    
    		If lastword = "hello" Then
    			e.Handled = True
    
    			textBox1.SelectionStart = startLineCharIndex
    			textBox1.SelectionLength = textBox1.Lines(line).Length
    			textBox1.SelectedText += Convert.ToString(e.KeyChar) & "world"
    		End If
    	End If
    End Sub
    
    


    Для связи [mail]
    • Помечено в качестве ответа Program-s.g 9 февраля 2011 г. 10:15
    9 февраля 2011 г. 9:21
  • private void textBox1_TextChanged(object sender, EventArgs e)
        {
          char[] sep = new char[] { ' ', ',', '.', ';' };
          string text1 = textBox1.Text.Split(sep).LastOrDefault();
          switch (text1)
          {
            case "hello": textBox1.AppendText(" world!\n");
              break;
            case "tomato": textBox1.AppendText(" good vegetable!\n");
              break;
            case "apple": textBox1.AppendText(" good fruit!\n");
              break;
            default:
              break;
          }
        }
    • Предложено в качестве ответа Andrew VIR 9 февраля 2011 г. 22:56
    • Помечено в качестве ответа Program-s.g 10 февраля 2011 г. 4:28
    9 февраля 2011 г. 22:50

Все ответы

  •  TextBox1.Text + "огурец" замени на "огурец". наверное, поможет.
    My blog
    8 февраля 2011 г. 17:45
  •  TextBox1.Text + "огурец" замени на "огурец". наверное, поможет.
    My blog
    Это понятно, но для этого нужен чтобы текстбокс был пустым, а он содержит определенный текст и поэтому я использую TextBox1.Text + "огурец", пользователь может писать с начала скажем "привет" в этом случае нечего не добавляется, потом добавляет огурец и к тексту добавляется вкусный овощ! и так далее.
    8 февраля 2011 г. 17:52
  • Условние TextBox1.Text = TextBox1.Text + "огурец" проверяет на равенство две строки - "текст" и "текстогурец". И оно никогда не выполняется.

    Если хочется проверить на "заканчивается на огурец", то тебе нужна проверка ElseIf TextBox1.Text.EndsWith("огурец") Then...


    My blog
    8 февраля 2011 г. 18:07
  • Спасибо PashPash ! А как можно проверить чем заканчивается строка?
    8 февраля 2011 г. 18:17
  • Что значит "чем заканчивается"?
    My blog
    8 февраля 2011 г. 18:57
  • Что значит "чем заканчивается"?
    My blog
    с каким словом заканчивается
    8 февраля 2011 г. 18:58
  • TextBox1.Text.Split.LastOrDefault
    My blog
    8 февраля 2011 г. 20:03
  • Можно сделать так:
        char[] sep; // массив разделителей слов
    
        public Form1()
        {
          InitializeComponent();
    
          sep = new[] { ' ', ',', '.', ';' };
          Array.Sort(sep);
        }
    
        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
          // проверяем является ли нажатый символ разделителем
          if (Array.BinarySearch(sep, e.KeyChar) >= 0)
          {
            string text = textBox1.Text.TrimEnd(sep); // текст без последнего разделителя
            int ind = text.LastIndexOfAny(sep); // поиск предпоследнего разделителя
    
            string lastword = text.Substring(ind >= 0 ? ind : 0); // выделение последнего слова
            label1.Text = "посл слово:" + lastword;
    
            //... проверка lastword на яблоки, огурцы и помидоры :)
          }
        }
    


    Для связи [mail]
    8 февраля 2011 г. 20:04
  • Здравствуйте!!! нужно после каждого введенного слово в Textbox, к тексту добавлялся другой текст, вот код

     

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.TextChangedEventArgs) Handles TextBox1.TextChanged
    
     If TextBox1.Text = "яблоко" Then
    
     TextBox1.Text = TextBox1.Text + "вкусный фрукт"
    
     ElseIf TextBox1.Text = TextBox1.Text + "огурец" Then
    
     TextBox1.Text = TextBox1.Text + "вкусный овощ"
    
     End If
    
     End Sub
    
    
    но добавляется только первое слово, как можно изменить код?

     


    А тебе нужно что-то вроде IntelliSense? Простите сразу не увидел, что добавляется одно слово. Этот хендлер будет правильно выполняться только после перехода на другой элемент управления т.е. после того как форма начнет обрабатывать сообщения, а пока Вы вводите текст она не обрабатывает сообщения, кроме сообщений клавиатуры и мыши. По моему так.
    8 февраля 2011 г. 20:55
  • Этот хэндлер выполняется сразу же после смены текста - ввода очередного символа, без необходимости смены фокуса.

    К смене фокуса привязана только валидация. 


    My blog
    8 февраля 2011 г. 21:12
  • TextBox1.Text.Split.LastOrDefault
    My blog

    Не помогает, опять проверяет каким словом заканчивается текстбокс, а не строка

     

    9 февраля 2011 г. 5:15
  •  

    А тебе нужно что-то вроде IntelliSense? 

    можно сказать да, только подсказки не нужно, нужно чтобы после каждого слово добавлялось определенное слово

    Проблема в том, что если писать слово1 потом слово 2, а потом между словом 1 и 2 писать слово 3 ,для него текст не добавляется (каждое слово пишется с новой строки)

    9 февраля 2011 г. 5:21
  • У вас многострочный текстбокс? И вам нужно проверять последнее слово относительно каретки? Я правильно вас понимаю?
    Для связи [mail]
    9 февраля 2011 г. 8:14
  • У вас многострочный текстбокс? И вам нужно проверять последнее слово относительно каретки? Я правильно вас понимаю?

    Да ,многострочный. вот пример

    слово1  (программа автоматически добавляет слово1')

    слово2 (программа автоматически добавляет слово2')

    а потом скажем между слово1 и 2 добавляет

    слово3 (программа автоматически добавляет слово3')

    9 февраля 2011 г. 8:19
  • то есть нужно проверить каждую строку, а не просто последнее слово 
    9 февраля 2011 г. 8:20
  • Как вам такой вариант: 

        char[] sep; // массив разделителей
    
        public Form1()
        {
          InitializeComponent();
    
          sep = new[] { ' ', ',', '.', ';' };
          Array.Sort(sep);
        }
    
        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
          if (Array.BinarySearch(sep, e.KeyChar) >= 0)
          {
            int startLineCharIndex = textBox1.GetFirstCharIndexOfCurrentLine();
            int line = textBox1.GetLineFromCharIndex(startLineCharIndex);
    
            string text = textBox1.Lines[line].TrimEnd(sep);
            int ind = text.LastIndexOfAny(sep);
    
            string lastword = text.Substring(ind >= 0 ? ind : 0);
            label1.Text = "посл слово:" + lastword;
    
            if (lastword == "hello")
            {
              e.Handled = true;
    
              textBox1.SelectionStart = startLineCharIndex;
              textBox1.SelectionLength = textBox1.Lines[line].Length;
              textBox1.SelectedText += e.KeyChar + "world";
            }
          }
        }
    


    Для связи [mail]
    • Предложено в качестве ответа Andrew VIR 9 февраля 2011 г. 17:03
    • Помечено в качестве ответа Program-s.g 9 февраля 2011 г. 17:09
    9 февраля 2011 г. 8:45
  • Abolmasov Dmitry, спасибо за код, но я C# не знаю,

     TextBox1.Text.StartsWith, к сожалению проверяет только первое слово, еще попробовал   If TextBox1.Text.Split.Last = "привет" Then

                TextBox1.AppendText("пока")

            End If

    опять получается не то,

    9 февраля 2011 г. 9:14
  • Private sep As Char()
    ' массив разделителей
    Public Sub New()
    	InitializeComponent()
    
    	sep = New () {" "C, ","C, "."C, ";"C}
    	Array.Sort(sep)
    End Sub
    
    Private Sub textBox1_KeyPress(sender As Object, e As KeyPressEventArgs)
    	If Array.BinarySearch(sep, e.KeyChar) >= 0 Then
    		Dim startLineCharIndex As Integer = textBox1.GetFirstCharIndexOfCurrentLine()
    		Dim line As Integer = textBox1.GetLineFromCharIndex(startLineCharIndex)
    
    		Dim text As String = textBox1.Lines(line).TrimEnd(sep)
    		Dim ind As Integer = text.LastIndexOfAny(sep)
    
    		Dim lastword As String = text.Substring(If(ind >= 0, ind, 0))
    		label1.Text = "посл слово:" & lastword
    
    		If lastword = "hello" Then
    			e.Handled = True
    
    			textBox1.SelectionStart = startLineCharIndex
    			textBox1.SelectionLength = textBox1.Lines(line).Length
    			textBox1.SelectedText += Convert.ToString(e.KeyChar) & "world"
    		End If
    	End If
    End Sub
    
    


    Для связи [mail]
    • Помечено в качестве ответа Program-s.g 9 февраля 2011 г. 10:15
    9 февраля 2011 г. 9:21
  • Вот здесь sep = New () {" "C, ","C, "."C, ";"C} пишет Ошибка 1 Требуется тип.

    9 февраля 2011 г. 9:29
  • это массив символов разделителей типа Char:

    sep = New Char() {" "c, ","c, "."c, ";"c}


    Для связи [mail]
    9 февраля 2011 г. 9:33
  • что-то не получается , а я правильно понял если писать hello , то к тексту добавляется world?
    9 февраля 2011 г. 9:49
  • Да так и должно быть, после набора hello и любого символа из массива sep

    Проверьте как-нибудь работает ли у вас обработчик KeyPress для textbox, если нет - то подпишитесь на него. 


    Для связи [mail]
    9 февраля 2011 г. 9:59
  • У вас многострочный текстбокс? И вам нужно проверять последнее слово относительно каретки? Я правильно вас понимаю?

    Да ,многострочный. вот пример

    слово1  (программа автоматически добавляет слово1')

    слово2 (программа автоматически добавляет слово2')

    а потом скажем между слово1 и 2 добавляет

    слово3 (программа автоматически добавляет слово3')

    Если текст многострочный и окно обрабатывает сообщение после ввода каждого символа, то почему бы не обрабатывать каждый символ на наличие пробела, потом в случае успеха брать последнее слово и добавлять к нему окончание с переходом на новую строку???

    Andrew Babukov
    9 февраля 2011 г. 12:10
  • Как вам такой вариант: 

     

      char[] sep; // массив разделителей
    
    
    
      public Form1()
    
      {
    
       InitializeComponent();
    
    
    
       sep = new[] { ' ', ',', '.', ';' };
    
       Array.Sort(sep);
    
      }
    
    
    
      private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    
      {
    
       if (Array.BinarySearch(sep, e.KeyChar) >= 0)
    
       {
    
        int startLineCharIndex = textBox1.GetFirstCharIndexOfCurrentLine();
    
        int line = textBox1.GetLineFromCharIndex(startLineCharIndex);
    
    
    
        string text = textBox1.Lines[line].TrimEnd(sep);
    
        int ind = text.LastIndexOfAny(sep);
    
    
    
        string lastword = text.Substring(ind >= 0 ? ind : 0);
    
        label1.Text = "посл слово:" + lastword;
    
    
    
        if (lastword == "hello")
    
        {
    
         e.Handled = true;
    
    
    
         textBox1.SelectionStart = startLineCharIndex;
    
         textBox1.SelectionLength = textBox1.Lines[line].Length;
    
         textBox1.SelectedText += e.KeyChar + "world";
    
        }
    
       }
    
      }
    
    

     


    Для связи [mail]

    ИМНО Вместо IF при статическом определении данных лучше использовать SWITCH, наверное при динамическом тоже. Простите, пишу под сишарп, ака давно не пишу на VB и постольку не помню.
    Andrew Babukov
    9 февраля 2011 г. 17:02
  • private void textBox1_TextChanged(object sender, EventArgs e)
        {
          char[] sep = new char[] { ' ', ',', '.', ';' };
          string text1 = textBox1.Text.Split(sep).LastOrDefault();
          switch (text1)
          {
            case "hello": textBox1.AppendText(" world!\n");
              break;
            case "tomato": textBox1.AppendText(" good vegetable!\n");
              break;
            case "apple": textBox1.AppendText(" good fruit!\n");
              break;
            default:
              break;
          }
        }
    • Предложено в качестве ответа Andrew VIR 9 февраля 2011 г. 22:56
    • Помечено в качестве ответа Program-s.g 10 февраля 2011 г. 4:28
    9 февраля 2011 г. 22:50