Как выяснить, происходит ли событие TextChanged, если пользователь вводит текстовое поле или myTextBox.Text вызывается программно - PullRequest
8 голосов
/ 09 марта 2012

Есть ли способ узнать, происходит ли событие "TextChanged", потому что

  1. пользователь печатает в текстовое поле или
  2. программист вызвал myTextBox.Text = "что-то"?

Просто чтобы дать вам некоторое представление об этом, я не хочу реагировать, когда пользователь вводит каждую букву в текстовое поле, поэтому я использую событие «Проверено», чтобы перехватить, когда пользователь закончил, чтобы я мог реагировать. Проблема в том, что у меня нет способа отловить, когда программист делает «myTextbox.Text =« что-то ». Единственный способ, которым я знаю, чтобы отследить изменения, это использовать TextChanged, но тогда я не хочу реагировать, когда Пользователь вводит каждую букву в текстовое поле. Есть предложения?

Ответы [ 4 ]

8 голосов
/ 09 марта 2012

Итак, в вашем классе «Форматированный» Textbox:

public override String Text{
   get{return text;}
   set
   {
      //perform validation/formatting
      this.text = formattedValue;
   }

это должно позволить вам отформатировать текст, когда он изменяется программистом, валидация пользовательского ввода все равно должна быть обработана в событии валидации.

6 голосов
/ 09 марта 2012

Я предполагаю, что вы создаете UserControl, который будут использовать другие разработчики, поэтому программисты «конечного пользователя» могут устанавливать текст программно.Я думаю, что самым простым было бы последовать предложению @ jzworkman и создать класс, который переопределяет установщик свойства Text.Как отмечает @vulkanino, вам, вероятно, следует поднять и поймать событие Validating .

public class TextBoxPlus : TextBox {
    public event CancelEventHandler ProgrammerChangedText;
    protected void OnProgrammerChangedText(CancelEventArgs e) {
        CancelEventHandler handler = ProgrammerChangedText;
        if (handler != null) { handler(this, e); }
    }

    public override string Text {
        get {
            return base.Text;
        }
        set {
            string oldtext = base.Text;
            base.Text = value;
            CancelEventArgs e = new CancelEventArgs();
            OnProgrammerChangedText(e);
            if (e.Cancel) base.Text = oldtext;
        }
    }
}

В своем источнике добавьте один и тот же обработчик к событиям Validating и ProgrammerChangedText:

// Somewhere...
textBoxPlus1.Validating += textBoxPlus1_Validating;
textBoxPlus1.ProgrammerChangedText += textBoxPlus1_Validating;

void textBoxPlus1_Validating(object sender, CancelEventArgs e) {
    decimal d;
    if (!Decimal.TryParse(textBoxPlus1.Text, out d)) {
        e.Cancel = true;
    }
}
0 голосов
/ 09 марта 2012

Если вы хотите выполнить проверку, используйте событие Validating, а не Validated (которое наступает, когда уже слишком поздно действовать).

Тем не менее, что такое real нужно здесь?

Событию Validating предоставляется объект типа CancelEventArgs.Если вы определите, что данные элемента управления недействительны, вы можете отменить событие Validating, установив для свойства Cancel этого объекта значение true.Если вы не установите свойство Cancel, Windows Forms будет считать, что проверка прошла успешно для этого элемента управления, и вызовет событие Validated.

(http://msdn.microsoft.com/en-us/library/ms229603.aspx)

0 голосов
/ 09 марта 2012
// This is the manual way, which is an alternative to the first way.
// Type 'this.TextChanged += ' into your form's constructor.
// Then press TAB twice, and you will have a new event handler.
this.TextChanged += new EventHandler(textBox1_TextChanged);

void textBox1_TextChanged(object sender, EventArgs e)
{
    //put the logic here for your validation/requirements for validation
    // ex.  if (textbox1.Text=="something") {//don't validate}
    //
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...