2013-05-31 2 views
1

Этот вопрос о расширенном контроле: FastColoredTextbox здесь: http://www.codeproject.com/Articles/161871/Fast-Colored-TextBox-for-syntax-highlightingFastColoredTextbox вопрос прокрутка текста и позиционирование каретки

Я пытаюсь автоматической прокрутка вниз текст и поместить текстовый курсор в последнем символе прилагаемый текст (общая длина текстового свойства, я полагаю).

проблема Текст скроллинг

Это работает для автоматической прокрутки текста:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     FastColoredTextBox1.Text = str 
     FastColoredTextBox1.ScrollLeft() 
     FastColoredTextBox1.Navigate(FastColoredTextBox1.Lines.Count - 1) 
    End Sub 

... Но я хочу, чтобы сделать его более общий характер, и это не работает:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    FastColoredTextBox1.Text = str 
End Sub 


Private Sub FastColoredTextBox1_TextChanged(sender As Object, e As FastColoredTextBoxNS.TextChangedEventArgs) Handles FastColoredTextBox1.TextChanged 
    sender.ScrollLeft() 
    sender.Navigate(FastColoredTextBox1.Lines.Count - 1) 
End Sub 

Любая ошибка или исключение, просто не сработает, текст не прокручивается, как в первый пример.

проблема клавиатуры положение курсора

О текстовом курсоре, я попытался это, но не работают слишком:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    FastColoredTextBox1.Text = str 
    FastColoredTextBox1.SelectionStart = FastColoredTextBox1.Text.Length 
End Sub 

Любая ошибка или исключение, просто не Работа.

UPDATE

Пробовал решение @ebyrob, но не работает, он не прокручивается вниз.

Imports FastColoredTextBoxNS 

Public Class Form1 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Dim str As String = String.Empty 
     For x As Int32 = 1 To 1000 : str += vbNewLine & x : Next 
     FastColoredTextBox1.Text = str 
    End Sub 

    Private Sub FastColoredTextBox1_TextChanged(sender As Object, e As TextChangedEventArgs) Handles FastColoredTextBox1.TextChanged 
     GoEnd() 
    End Sub 

    Public Sub GoEnd() 
     If FastColoredTextBox1.Lines.Count > 0 Then 
      FastColoredTextBox1.Selection.Start = New Place(FastColoredTextBox1.Lines(FastColoredTextBox1.Lines.Count - 1).Count, FastColoredTextBox1.Lines.Count - 1) 
     Else 
      FastColoredTextBox1.Selection.Start = New Place(0, 0) 
     End If 
     FastColoredTextBox1.DoCaretVisible() 
    End Sub 

End Class 

Update Два

Код @ebyrob работает только тогда, когда я называю "GoEnd" всегда после добавления текста, как в этом примере:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim str As String = String.Empty 
    For x As Int32 = 1 To 1000 : str += vbNewLine & x : Next 
    FastColoredTextBox1.Text = str 
    GoEnd() 
End Sub 

Это то же самое проблема моей первой проблемы, которую я прокомментировал (событие TextChanged работает не так, как ожидалось), мне нужно сделать его эффективным и универсальным, я предположил, что событие TextChanged Control будет правильное событие, чтобы поставить «GoEnd()», но definitivelly - нет.

Я не хочу, чтобы это когда-либо:

1. Add text 
2. Call GoEnd 
3. Add more text 
4. Call again GoEnd 

Я wan't поставить «GoEnd» в событии, которое succed, когда текст изменен, чтобы упростить вещи:

1. add text 
2. add more text 

UPDATE ТРИ

Все проблемы будут решены, только изменили название события:

Public Class Form1 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim mytext As String = String.Empty 
     For x As Int32 = 1 To 1000 : mytext += vbNewLine & x : Next 
     FastColoredTextBox1.Text += mytext 
     FastColoredTextBox1.Focus() 
    End Sub 

Private Sub FastColoredTextBox1_TextChanged(sender As Object, e As FastColoredTextBoxNS.TextChangedEventArgs) _ 
    Handles FastColoredTextBox1.TextChangedDelayed 

    sender.ScrollLeft() 
    sender.Navigate(sender.Lines.Count - 1) 
    FastColoredTextBox1.SelectionStart = FastColoredTextBox1.Text.Length 

End Sub 

End Class 
+0

Мне сложно понять, что именно ваш вопрос и что вы пытаетесь достичь ... можете ли вы подробнее рассказать? –

+0

Что вы подразумеваете под «не работает»? Это просто ошибка компиляции из-за того, что вы не отправили отправителя FastColoredTextBox? Также не должен быть последним примером '.SelectionStart = FastColoredTextBox1.Text.Length - 1'? –

+1

Вам нужно будет отбросить этот объект 'sender'. Вам нужно документировать, что такое компонент FastColoredTextBox. – LarsTech

ответ

2

Видимо уже существует метод только для этой операции:

public void GoEnd() 
    { 
     if (lines.Count > 0) 
      Selection.Start = new Place(lines[lines.Count - 1].Count, 
             lines.Count - 1); 
     else 
      Selection.Start = new Place(0, 0); 

     DoCaretVisible(); 
    } 

Примечание вы также хотите:

Dim tbSender as FastColoredTextBox 
tbSender = DirectCast(sender, FastColoredTextBox) 
tbSender.Text = str 
tbSender.GoEnd() 
' ... 

Наконец я рекомендую:

Option Explicit 

Почти во всем коде VB.

EDIT: после тестирования управления, замедленное событие работает

FastColoredTextBox1.TextChangedDelayed += FastColoredTextBox1_TextChanged; 

Примечание: Это означает, что по умолчанию задержка в 100 мс для каждого события обожженного.

+0

Спасибо за комментарий, я перевел его, но не работает (любое исключение) текст не прокручивается, а текстовые курсоры в первой букве полного текста, вы можете увидеть код в моем обновленном вопросе (извините) причина моего английского). – ElektroStudios

+0

Я обновил вопрос снова. – ElektroStudios

+0

Когда вы вызываете 'GoEnd()' выше, где он привязан к объекту? Кроме того, вы используете «Option Explicit»? Наконец, что произойдет, если вы дважды нажмете кнопку в «общем» решении. Просканирует ли он частично?Если это так, то у вас есть проблема с событием, связанная с событием, возможно, он выстреливает, прежде чем текст будет фактически обновлен. –

Смежные вопросы