2012-02-25 1 views
4

Хорошо, что у меня есть текстовое поле, которое было заполнено некоторым текстом в зависимости от того, что было выбрано из списка.Как заменить символы в текстовом поле, когда пользователь вводит его? (в C#)

сказать текстовое поле выглядит следующим образом: «?»

blah blah ??? as?f 

, что мне нужно, чтобы выяснить, как сделать это каждый раз, когда пользователь щелкает в текстовом поле и удаляет character, я хотел бы заменить этот символ на *, а затем всякий раз, когда они пытаются удалить *, он будет заменен на «?» , так что конечный результат будет выглядеть примерно так:

blah blah **? as*f 

если они удалили все, кроме одного "?".

Независимо от того, как долго я искал в Интернете, я не могу найти что-нибудь подобное .. ближе всего я нашел не этот вопрос - Determine when and which character is added or deleted in a Text Box

Но это реально не поможет то, что я пытаюсь сделать .. если у кого-то есть хорошая идея о том, с чего начать смотреть или даже как это сделать, я был бы очень доволен!

благодарит заранее!

EDIT: Да, это приложение для Windows Form, извините, я забыл указать это. O.o

+0

Это WinForms? –

+0

Я сожалею, забыл упомянуть об этом. –

ответ

4

Вы можете обрабатывать KeyDown событий и перепускной обработки по умолчанию. Обработчик события может выглядеть следующим образом:

public void OnKeyDown(Object sender, KeyEventArgs e) 
{ 
    char[] text = textBox.Text.ToCharArray(); 
    int pos = textBox.SelectionStart; 

    switch (e.KeyCode) 
    { 
     case Keys.Back: if (pos == 0) return; pos --; break; 
     case Keys.Delete: if (pos == text.Length) return; break; 
     default: return; 
    } 

    switch (text[pos]) 
    { 
     case '?': text[pos] = '*'; break; 
     case '*': text[pos] = '?'; break; 
     default: return; 
    } 
    textBox.Text = new String(text); 
    e.Handled = true; 
} 

Вы также можете добавить проверки для клавиш-модификаторов, отрегулируйте положение курсора, а также осуществлять пользовательское поведение при выборе текста, если это необходимо.

+0

Это почти работает. Всякий раз, когда я добавлял строку кода «textBox.selectionStart = pos;» чтобы вернуть курсор туда, где он был, он удалит? отлично, и добавьте * штраф, но по какой-то причине удалите лишний? .. два? будут удалены, а один * появится из одного обратного пробела ... однако нажатие кнопки delete вместо backspace, похоже, работает просто отлично и помещает курсор туда, где он должен быть, не удаляя ничего лишнего. Я поставил точку останова на каждую строку моего ключа даже, и он показывает «текст» как правильный на каждом шагу ...>< –

+0

Есть ли другой обработчик, который обрабатывает обратное пространство? Вы можете попробовать отключить backspace в этом обработчике, чтобы убедиться, что он все еще проходит. Кроме того, прослушивание события TextChanged может помочь его отладить. –

+0

Это метод, который я буду использовать, хотя я не могу исправить эту ошибку прямо сейчас, я посмотрю вокруг и посмотрю, что я могу понять. спасибо за толкание в правильном направлении! –

2

Сохраните текстовое поле. Текст в некоторой строке после каждого нажатия клавиши (textbox.KeyPress), сравнивая сохраненную строку с текстом внутри текстового поля, узнайте, есть ли '?' был удален, если он был вставлен '*' в текстовый текст в нужном месте.

//get indexes of all '?' 
list<int> charlist = new list<int>(); 
string buff = textbox.Text; 
for(int c = 0; c< buff.length, c++) 
{ 
    if (buff[c] == '?') 
    { 
     charlist.add(c) 
    } 
} 
//inside keypress event 
foreach(int c in charlist) 
{ 
    if (textbox.Text[c] != '?') 
    { 
     textbox.Text = textbox.Text.Insert(c, "*"); 
    } 
} 
Смежные вопросы