DUDA Labels RichTextBox C# 2012. NET

Iniciado por Yaldabaot, 29 Mayo 2016, 07:17 AM

0 Miembros y 1 Visitante están viendo este tema.

Yaldabaot

Hola soy yo de nuevo para molestarlos.

Estoy haciendo un editor de texto, resulta que quiero que cuando digito en el richtextbox o el usuario digite en él , en la parte de abajo  sea cualquier tecla se muestre el número de columna y fila ACTUALIZADO en sus respectivos labels del control (control Status Strip) , esto lo subrayo ya que cuando presiona la tecla debo presionarla dos veces para que muestre el dato actualizado, en fin pude lograr hacerlo pero no de la mejor manera, ya que cuando lo realizo se muestra pero algo atrasado, digamos que marco la flechita arriba, abajo, enter pero aveces sigue mostrando la línea anterior y no comprendo por que sinceramente.


Les adjunto mi códido este es el método, donde RH es el richtextbox y TS son los labels del Status Strip.

Código (csharp) [Seleccionar]


private void actualizar_lineas(){

           //Actualiza el número actual de la línea
           int int_line = 0;
           int int_column = 0;

           RH_Editor.DeselectAll();
           int_line = 0;
           TS_Linea.Text = "";
         
           int_line = RH_Editor.GetLineFromCharIndex(RH_Editor.SelectionStart);
           TS_Linea.Text = int_line.ToString();
           Update();

           RH_Editor.DeselectAll();
           int_column = 0;
           TS_Columna.Text = "";

           int_column = RH_Editor.SelectionStart - RH_Editor.GetFirstCharIndexFromLine(int_line);
           TS_Columna.Text = int_column.ToString();
           Update();
         
       
       
       }




Y este es el evento keydown

Código (csharp) [Seleccionar]


 if (e.KeyData == Keys.Left || e.KeyData == Keys.Up || e.KeyData == Keys.Down || e.KeyData == Keys.Right  ){


               TS_Linea.Text = "";
               TS_Columna.Text = "";
               Update();
               actualizar_lineas();

           }

           else{

               TS_Linea.Text = "";
               TS_Columna.Text = "";
               Update();
               actualizar_lineas();

           }




Bien, lo hice así para ver si fuerzo que haga la actualización pero sigue igual, entonces no se que podrá ser.

Les agradecería mucho.
Nunca me contestan -_-

Eleкtro

#1
Lo que ocurre es que estás controlando el evento inadecuado, en el evento RichTextBox.KeyDown NO se desplaza el caret, por ende, estás intentando obtener una información (índice de columna/linea) que todavía no ha sido asignada a la nueva posición del caret.

Aparte de eso, no es buena idea que llames al método Form.Update() o RichTextBox.Update() en cada pulsación, es innecesario y muy expensivo, además, en cualquier caso el método que deberías llamar debería ser StatusStrip.Update().

¿La solución?, controlar el evento RichTextBox.KeyUp:

VB.NET:
Código (vbnet) [Seleccionar]
   Private Sub RtbEditor_KeyUp(sender As Object, e As KeyEventArgs) _
   Handles RtbEditor.KeyUp
       Me.UpdateStatusBarInfo(DirectCast(sender, RichTextBox))
   End Sub

   Private Sub UpdateStatusBarInfo(ByVal rtb As RichTextBox)
       Dim lineIndex As Integer = rtb.GetLineFromCharIndex(rtb.SelectionStart)
       Dim colIndex As Integer = (rtb.SelectionStart - rtb.GetFirstCharIndexFromLine(lineIndex))

       TsLblLine.Text = Convert.ToString(lineIndex)
       TsLblCol.Text = Convert.ToString(colIndex)
   End Sub


C#:
Código (csharp) [Seleccionar]
private void RtbEditor_KeyUp(object sender, KeyEventArgs e)
{
this.UpdateStatusBarInfo((RichTextBox)sender);
}

private void UpdateStatusBarInfo(RichTextBox rtb)
{
int lineIndex = rtb.GetLineFromCharIndex(rtb.SelectionStart);
int colIndex = (rtb.SelectionStart - rtb.GetFirstCharIndexFromLine(lineIndex));

TsLblLine.Text = Convert.ToString(lineIndex);
TsLblCol.Text = Convert.ToString(colIndex);
}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================


Saludos








Yaldabaot

Nunca me contestan -_-