locked
Problemas al insertar texto en richtextbox RRS feed

  • Pregunta

  • Buenas.

    Tengo un WinForm con un richtextbox que contiene un texto con formato, hay partes en negrita o cursiva, parte en colores y alguna línea con justificación centrada, etc. Hay algunos botones que al pulsarlos insertan cierto texto, y el problema surge al insertar ese texto al pulsar los botones, cambia todo el formato a excepción del texto que inserto. Mi código es este:

    private void ClkbtsFecha(object sender, EventArgs e)
    {
         Int32 posicionactual = 0;
         String campo = null;

         posicionactual = rtbTexto.SelectionStart; // Posición actual del cursor

         if (sender == btDia)
              campo = DateTime.Now.Day.ToString("00");
         else if (sender == btMes)
              campo = DateTime.Now.Month.ToString("00");
         else if (sender == btAno)
              campo = DateTime.Year.ToString();

         rtbTexto.Text = rtbTexto.Text.Insert(posicionactual, campo); // Inserción del texto

         rtbTexto.SelectionLength = campo.Length; // Selecciona el texto que acaba de insertar
         rtbTexto.SelectionColor = Color.FromArgb(rtbTexto.SelectionColor.A, rtbTexto.SelectionColorR, rtbTexto.SelectionColorG, rtbTexto.SelectionColor.B); // Aplica el color

         rtbTexto.SelectionFont = new Font(rtbTexto.SelectionFont.FontFamily.Name, rtbTexto.SelectionFont.Size, FontStyle.RegularI; // Aplica la fuente

         rtbTexto.Select(); 
         rtbTexto.SelectionStart = (posicionactual + campo.Length); // Mueve el cursor al final del texto insertado
         rtbTexto.SelectionLength = 0;
    }

    Pienso que no haría falta ni la línea de color y de la fuente, ya que cuando el cursor se posiciona en una parte del richtextbox todo esto queda determinado. ¿Alguna idea?, cualquiera será bienvenida porque no sé por donde tirar.

    lunes, 2 de septiembre de 2019 22:08

Respuestas

  • Hola Gustavo

    No estoy seguro, pero creo que lo que estás intentando hacer es insertar la fecha actual al Text del RichTextBox, y que el problema con el formato es que al insertar el dia, o el mes, o el año, desplazás el mismo para adelante

    Lo que yo haría es poner en donde debería ir la fecha actual algo como "__/__/____" y luego obtener la fecha actual toda junta, que sería 03/09/2019, y reemplazar ... así no habrá desplazamiento y supongo que no se cambiará el formato

    string fecha = ObtenerFecha(); // 03/09/2019
    richTextBox1.Text = richTextBox1.Text.Replace("__/__/____", fecha);
    

    Si esto no funciona, podes enviarme el formulario con todo para tratar de ver como hacer

    Saludos

    Pablo

    martes, 3 de septiembre de 2019 17:06
  • Hola.

    Tienes toda la razón, así es, estudiándolo en profundidad de eso se trata, hay un desplazamiento y se pierde el formato.

    He visto dos formas de resolverlo, una que he visto por ahí es que se pueden insertar códigos RTF, el problema es que habría que conocer bien estos códigos, y es un tema complejo y engorroso, entre otras cosas ya no sirve la posición que se puede averiguar con el evento SelectChanged del RichTextBox. La otra solución que he encontrado y he implantado es la siguiente (pienso que no es la más adecuada pero necesito terminarlo y funciona bien):

    - Hay dos RichTextBox, el que ve el usuario y otro detrás con visible = false;

    - Cuando el usuario selecciona un campo a insertar, recorro el RichTextBox visible carácter a carácter, averiguo alineación de texto, fuente, y color, y coloco estos datos en el RichTextBox oculto, y con AppendText añado el carácter leído, y ya mantiene el formato.

    - Cuando el contador de caracteres llega a la posición donde el usuario desea insertar el campo entonces igualmente con AppendText lo añado.

    - Después continuo hasta el final del RichTextBox visible.

    - Una vez terminado pongo de nuevo los datos del RichTextBox oculto en el visible con RichTextBoxVisible.Rtf = RichTextBoxOculto.Rtf.

    Como digo, poco ortodoxo pero eficiente, aun en documentos de muchas páginas es casi instantáneo y como digo por ahora y hasta que sepa más me sirve.

    Saludos.

    miércoles, 4 de septiembre de 2019 17:47
  • Hola Pablo.

    Gracias por responder. Lo que me comentas no me sirve, he puesto como ejemplo la fecha para intentar explicar qué es lo que intento hacer, pero en realidad es más complejo. La aplicación inserta una serie de datos que el usuario elige, y yo los coloco en el richTextBox con una clave, siguiendo el ejemplo sería [DIA], o [MES] o [AÑO], este documento se guarda como una plantilla. Más tarde, el usuario aplica esa plantilla en otra ventana y es cuando esas claves se convierten al día, mes o año correspondientes.

    Como dato curioso si en lugar de usar rtbTexto.Text.Insert uso rtbAppendText el formato no se modifica, pero tampoco es la solución, ya que no siempre el usuario inserta los datos al final del documento.

    Saludo.

    martes, 3 de septiembre de 2019 17:40

Todas las respuestas

  • Hola Gustavo

    No estoy seguro, pero creo que lo que estás intentando hacer es insertar la fecha actual al Text del RichTextBox, y que el problema con el formato es que al insertar el dia, o el mes, o el año, desplazás el mismo para adelante

    Lo que yo haría es poner en donde debería ir la fecha actual algo como "__/__/____" y luego obtener la fecha actual toda junta, que sería 03/09/2019, y reemplazar ... así no habrá desplazamiento y supongo que no se cambiará el formato

    string fecha = ObtenerFecha(); // 03/09/2019
    richTextBox1.Text = richTextBox1.Text.Replace("__/__/____", fecha);
    

    Si esto no funciona, podes enviarme el formulario con todo para tratar de ver como hacer

    Saludos

    Pablo

    martes, 3 de septiembre de 2019 17:06
  • Hola Pablo.

    Gracias por responder. Lo que me comentas no me sirve, he puesto como ejemplo la fecha para intentar explicar qué es lo que intento hacer, pero en realidad es más complejo. La aplicación inserta una serie de datos que el usuario elige, y yo los coloco en el richTextBox con una clave, siguiendo el ejemplo sería [DIA], o [MES] o [AÑO], este documento se guarda como una plantilla. Más tarde, el usuario aplica esa plantilla en otra ventana y es cuando esas claves se convierten al día, mes o año correspondientes.

    Como dato curioso si en lugar de usar rtbTexto.Text.Insert uso rtbAppendText el formato no se modifica, pero tampoco es la solución, ya que no siempre el usuario inserta los datos al final del documento.

    Saludo.

    martes, 3 de septiembre de 2019 17:40
  • Hola Gustavo

    Lo que decís del dato curioso, hace más probable mi suposición: al agregar al final (AppendText) del texto del rtbTexto, no desplazás la posición de los caracteres previamente colocados en el Text del mismo (por eso no cambia su formato); pero si insertás al principio o en medio del mismo, los caracteres que le siguen al string que insertás se desplazan hacia adelante. Lo que creo que podría ser es que el formato de esos char no se adelante también, o sea que es como si retrocediera tantas posiciones como la longitud del string insertado.

    Voy a tratar de reproducir tu problema en un WinForm, aunque nunca usé un RichTextBox. Pero si pudieras pasarme tu Form con todo quizás podría verlo y solucionarlo mejor.

    Saludos

    miércoles, 4 de septiembre de 2019 1:19
  • Hola.

    Tienes toda la razón, así es, estudiándolo en profundidad de eso se trata, hay un desplazamiento y se pierde el formato.

    He visto dos formas de resolverlo, una que he visto por ahí es que se pueden insertar códigos RTF, el problema es que habría que conocer bien estos códigos, y es un tema complejo y engorroso, entre otras cosas ya no sirve la posición que se puede averiguar con el evento SelectChanged del RichTextBox. La otra solución que he encontrado y he implantado es la siguiente (pienso que no es la más adecuada pero necesito terminarlo y funciona bien):

    - Hay dos RichTextBox, el que ve el usuario y otro detrás con visible = false;

    - Cuando el usuario selecciona un campo a insertar, recorro el RichTextBox visible carácter a carácter, averiguo alineación de texto, fuente, y color, y coloco estos datos en el RichTextBox oculto, y con AppendText añado el carácter leído, y ya mantiene el formato.

    - Cuando el contador de caracteres llega a la posición donde el usuario desea insertar el campo entonces igualmente con AppendText lo añado.

    - Después continuo hasta el final del RichTextBox visible.

    - Una vez terminado pongo de nuevo los datos del RichTextBox oculto en el visible con RichTextBoxVisible.Rtf = RichTextBoxOculto.Rtf.

    Como digo, poco ortodoxo pero eficiente, aun en documentos de muchas páginas es casi instantáneo y como digo por ahora y hasta que sepa más me sirve.

    Saludos.

    miércoles, 4 de septiembre de 2019 17:47