?

Log in

No account? Create an account

Entries by tag: .net bug textbox.text

Моя первая ошибка в .net framework
roller avatar
_k_i_a_
о да!  эмоции однако!
Очень долго пытался отладить очень простой компонентик основанный на TextBox, основная фича компонентика - переопределение свойства Text... наткнулся в геттере на ошибку из за которой у меня возвращалось неправильное значение, исправил, и... текст исчез что бы я не пытался сделать, текст обратно не появлялся... я думал с ума сойду пытаясь найти в 10 строчках кода ошибку....
тут друг посоветовал взять програмку "Reflector" которая дизасемблирует исходники фреймворка и позволяет посмотреть что там происходит... итак...

для того, чтобы текст появился у компонента, я в единственном месте в программе вызываю сеттер базового класса base.Text =  так вот что же происходит внутри:  

сначала идем в TextBox  где опять вызывается base.Text,  попадаем в TextBoxBase где опять base.Text,  попадаем в Control и тут всё значительно интереснее:

 set
    {
        if (value == null)
        {
            value = "";
        }
        if (value != this.Text)
        {
            if (this.CacheTextInternal)
            {
                this.text = value;
            }
            this.WindowText = value;
            this.OnTextChanged(EventArgs.Empty);
            if (this.IsMnemonicsListenerAxSourced)
            {
                for (Control control = this; control != null; control = control.ParentInternal)
                {
                    ActiveXImpl impl = (ActiveXImpl) control.Properties.GetObject(PropActiveXImpl);
                    if (impl != null)
                    {
                        impl.UpdateAccelTable();
                        return;
                    }
                }
            }
        }
    }
}


особенно стоит обратить внимание на строку:  if (value != this.Text)
без которой собственно текст не отобразится.... и как думаете, что произойдет если сделать так?
именно, запрос о тексе пойдет наверх по иерархии классов и не дай гот там окажется тоже самое :)
ошибка в моём Text get именно и давала неверный результат, что приводило к правильной работе фреймворка :) 

решить проблемму очень просто, достаточно ввести булеву переменную
bool HelloUglyStupidMF и взводить её тогда когда нужно что то прописать в base.Text, соответственно в геттере Text если переменная взведена, то посылать на... ну тоесть обратно по иерархии...

P.S. вот интересно, у меня сейчас .net 3.5 а давно эта ошибка живет уже?...