none
Cómo evitar que se borre una palabra específica de una cadena de texto en un textbox. RRS feed

  • Pregunta

  • Buenas noches amigos mi problema es el siguiente:

    tengo un texto predefinido en un textbox ese lo programo internamente. un texto de ejemplo podría ser este:

    buenas noches amigos cómo están...

    yo deseo que el usuario pueda modificar todo el texto excepto la palabra amigos, puedo saber en qué posición está utilizando el IndexOf pero no estoy seguro de que más modificarle para que el usuario no pueda tocar esa palabra de la cadena. e buscado en todos lados, por favor ayuda.

    martes, 31 de marzo de 2020 2:36

Respuestas

  • hola

    La verdad usando un unico textbox lo unico que se me ocurre es dejar libre la edicion y validar si quito el texto

    Ahora como alternativa podrias separar el ingreso de los datos en dos textbox: pondrias un primer textbox, luego un label con el texto "amigos" y al final otro textbox, de esta forma el usuario escribe en los textbox y despues armas la frase final

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Jairo Lozano martes, 31 de marzo de 2020 23:50
    martes, 31 de marzo de 2020 4:36
  • qué tal amigo, ya pude resolver el problema, utilice parte de su código y una propiedad del textbox llamada undo(). El código quedó de esta manera,

     private void txt_cuerpo_modificar_TextChanged(object sender, EventArgs e)
            {

                if (!txt_cuerpo_modificar.Text.Contains("amigo") || !txt_cuerpo_modificar.Text.Contains("colega"))
                {
                    MessageBox.Show("No puede quitar la palabra","ARCANA",MessageBoxButtons.OK,MessageBoxIcon.Warning);

                    txt_cuerpo_modificar.Undo();
                    //el método undo() revierte la última acción realizada en textbox
                } 
            }

    saludos desde Colombia...

    • Marcado como respuesta Jairo Lozano martes, 31 de marzo de 2020 23:50
    martes, 31 de marzo de 2020 23:50

Todas las respuestas

  • hola

    Quieres que no pueda tocarse en el texto o quieres validar que esa palabra este presente? porque son cosas diferentes

    Si es solo validarlo podrias usar

    if(!textbox1.Text.Contains("amigos")){
    
         MessageBox.Show("No puede quitar la palabra 'amigos'");
    
         return;
    
    }
    
    //resto codigo

    asi validas si esa palabra aun esta en el texto

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 31 de marzo de 2020 3:16
  • hola, quiero que no me deje borrar únicamente esa palabra, no sé si con alguna condición pueda inhabilitar la tecla de borrado en ese punto.

    ya probé el código en un evento textchanged de manera que cada vez que pulse una tecla valide y, me bota el mensaje de error, podría servir para el fin que deseo si existiera la manera de deshacer mediante código la acción, algo así como un ctrl + z    ej,

      private void txt_cuerpo_modificar_TextChanged(object sender, EventArgs e)
            {
                if (!txt_cuerpo_modificar.Text.Contains("amigos"))
                {
                    MessageBox.Show("No puede quitar la palabra");
         //aquí la instrucción de deshacer.

                }
            }

    saludos.

     

    martes, 31 de marzo de 2020 3:26
  • hola

    La verdad usando un unico textbox lo unico que se me ocurre es dejar libre la edicion y validar si quito el texto

    Ahora como alternativa podrias separar el ingreso de los datos en dos textbox: pondrias un primer textbox, luego un label con el texto "amigos" y al final otro textbox, de esta forma el usuario escribe en los textbox y despues armas la frase final

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Jairo Lozano martes, 31 de marzo de 2020 23:50
    martes, 31 de marzo de 2020 4:36
  • qué tal amigo, ya pude resolver el problema, utilice parte de su código y una propiedad del textbox llamada undo(). El código quedó de esta manera,

     private void txt_cuerpo_modificar_TextChanged(object sender, EventArgs e)
            {

                if (!txt_cuerpo_modificar.Text.Contains("amigo") || !txt_cuerpo_modificar.Text.Contains("colega"))
                {
                    MessageBox.Show("No puede quitar la palabra","ARCANA",MessageBoxButtons.OK,MessageBoxIcon.Warning);

                    txt_cuerpo_modificar.Undo();
                    //el método undo() revierte la última acción realizada en textbox
                } 
            }

    saludos desde Colombia...

    • Marcado como respuesta Jairo Lozano martes, 31 de marzo de 2020 23:50
    martes, 31 de marzo de 2020 23:50
  • Hola Jairo 

    Esto que pedis es un poco sofisticado pero vamos a hacerlo, controlando el evento Key_Down del TextBox. Ahora lo hago y te lo paso ... 

    Me superó el .Net Framework ... no reconoce la tecla Delete (o Supr) ... así que por ahora no podes borrar el string word (que le asigné "amigos") excepto con la tecla Delete, que adjunto captura de pantalla que lo lee cualquier cosa ... quizás algunos de los sabelotodos (y lo digo en serio), como Leandro Tuttini o Alberto Poblacion, nos puedan decir o ayudar a investigar como se puede capturar la tecla Delete (o Supr) y por qué no funciona para tu código

    No podes escribirle arriba al string (word: "amigos") ni borrarlo con Backspace, sólo podes borrarlo con Delete. Faltaría cierta funcionalidad como por ejemplo si escribis "amigos" delante, ahí me mandas la lógica al Diablo, o si seleccionas y borras con Ctrl+X por ejemplo. 

    using System;
    using System.Windows.Forms;
    
    namespace WinFormsAppTextBox
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private bool NoPrint;
    
            private void textBox1_KeyDown(object sender, KeyEventArgs e)
            {
                string word = "amigos";
    
                NoPrint = false;
    
                if (textBox1.SelectionStart >= textBox1.Text.IndexOf(word) + 1
                    && textBox1.SelectionStart < textBox1.Text.IndexOf(word) + word.Length 
                    && e.KeyCode != Keys.Right && e.KeyCode != Keys.Left)
                {
                    NoPrint = true;
                }
    
                if (textBox1.SelectionStart >= textBox1.Text.IndexOf(word) && textBox1.SelectionStart < textBox1.Text.IndexOf(word) + word.Length - 1
                    && e.KeyCode == Keys.Delete)
                {
                    NoPrint = true;
                }
    
                if (textBox1.SelectionStart > (textBox1.Text.IndexOf(word) + 1) 
                    && textBox1.SelectionStart <= (textBox1.Text.IndexOf(word) + word.Length) 
                    && e.KeyCode == Keys.Back)             
                {
                    NoPrint = true;
                }
            }
    
            private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (NoPrint == true)
                    e.Handled = true;
            }
        }
    }

    Espero que de alguna forma te sea útil y que los sabelotodos nos ayuden a retocarlo porque yo también me quedé un poco impaciente.

    Saludos

    Pablo

    EDITO: La captura de pantalla no me muestra el valor del e.KeyCode que muestra el Debugger, pero era algo como "e.KeyCode | RButton | MButton | Back | Space" ... nada que ver con Delete.

    miércoles, 1 de abril de 2020 0:16
  • Hilo cerrado
    viernes, 3 de abril de 2020 19:41
    Moderador