Ray Fischer Ответов: 1

Textbox_changed событие не распознано, код за генерируемым texbox


Здравствуйте Эксперты,

В настоящее время я пытаюсь использовать созданное с помощью кода текстовое поле в качестве триггера для события TextBox_Changed. Я могу получить текстовое поле создается, и даже возможность получить делегатом EventHandler регистрируется и присваивается текстовое поле. Однако, когда я приступаю к отладке, я получаю сообщение об ошибке браузера в IE (я должен разработать для этого руководства компании - браузера!). Ошибка "TextBox_TextChanged" не определена.

Вот мой код для создания текстового поля (на самом деле это серия полей, но он одинаков для каждого из них) -

//  If session variable is visible in the grid, add its text box and description one column over

if (sessVars[i].Keyvis == true)
{
    TextBox txtBxNm = new TextBox();
    txtBxNm.Width = 48;
    txtBxNm.ID = "txtBoxNomPt" + rw + cl;
    txtBxNm.AutoPostBack = true;
    txtBxNm.Attributes.Add("OnChange", "TextBox_TextChanged");
    txtBxNm.TextChanged += new EventHandler(TextBox_TextChanged);
    this.NomFlds.Rows[rw].Cells[cl].Controls.Add(txtBxNm);
    if (sessVars[i].Value != "" && sessVars[i] != null)
    {
        txtBxNm.Text = sessVars[i].Value.ToString();
    }

    this.NomFlds.Rows[rw].Cells[cl + 1].Text = sessVars[i].PosDesc.ToString();
}


Приведенный выше код появляется внутри моей загрузки страницы page_load / !=IsPostBack. Позже в классе code-behind у меня есть следующий код метода для этого события -

protected void TextBox_TextChanged(object sender, EventArgs e)
       {
           sql_val nom_p_des = new sql_val();
           Control control = (Control)sender;
           TextBox thisctrl = new TextBox();
           control = (Control)thisctrl;
           String ctrlName = control.ID;
           int nmlen = ctrlName.Length;
           int rmdr = nmlen - 11;
           int posid = int.Parse(ctrlName.Substring(12, rmdr).ToString());
           nom_p_des.Num_whr_flds = 0;

           switch (posid)
           {
               case 00:
                   nom_p_des.Frm_table = "Position1";
                   nom_p_des.Keycall = true;
                   nom_p_des.Dtypefld = "str";
                   nom_p_des.Keypos = 1;

                   break;
               case 01:
                   nom_p_des.Frm_table = "Position2";
                   nom_p_des.Keycall = true;
                   nom_p_des.Dtypefld = "str";
                   nom_p_des.Keypos = 2;

                   break;


..... Это продолжается (но я не делаю этого так далеко!)

Что я уже пробовал:

Я попытался изменить событие (сначала у меня была проблема, что оно даже не стреляло, затем я перешел на TextBoxChanged, и оно начало стрелять - хорошо). Теперь я начинаю думать, что есть какая-то проблема с рендерингом. Когда я смотрю на версии отладчика браузера других стандартных событий TextBox_Changed на других страницах, они визуализируются так же, как это происходит внутри HTML -

onchange="javascript:setTimeout('__doPostBack(\'ctl00$TurbineWheel$TWExdDiam\',\'\')', 0)"


Когда я смотрю на версию отладчика браузера событий для генерируемых текстовых полей кода, они выглядят примерно так после рендеринга в HTML -

onchange="TextBox_TextChanged;setTimeout('__doPostBack(\'


Таким образом, создается впечатление, что преобразование в JavaScript отсутствует. Не знаю почему. Я был бы признателен за любую помощь. Спасибо.

---Скат

F-ES Sitecore

Вы создаете свои текстовые поля и прикрепляете события к каждой обратной передаче, а не только к начальной загрузке страницы?

Ray Fischer

Привет Ф-Эс,

Да, у меня есть раздел в загрузке страницы для этого тоже. Но так далеко дело не заходит. Как только я запускаю событие изменения, оно выдает мне ошибку. Вот мой (else) для !=IsPostback на Page_Load -
если (sessVars[i].Keyvis == true)
{
TextBox txtBxNm = новое текстовое поле();
txtBxNm.Width = 48;
txtBxNm.ID = "txtBoxNomPt" + rw + cl;
txtBxNm.Autopostback элемента управления = истина;
txtBxNm.Атрибуты.Добавить("runat", "server");
txtBxNm.Атрибуты.Добавить("OnChange", "TextBox_TextChanged");
txtBxNm.TextChanged += новый EventHandler(TextBox_TextChanged);
этот.NomFlds.Строк[РАО].Клеток[КЛ].Контроля.Добавить(txtBxNm);
если (sessVars[я].Значение != ""и усилитель; & sessVars[я] != нуль)
{
txtBxNm.Text = sessVars[i].Value.Метод toString();
}

                    this.NomFlds.Rows[rw].Cells[cl + 1].Text = sessVars[i].PosDesc.ToString();
                }


Так что это в основном одно и то же. NomFlds-это просто GridView, который содержит элементы управления текстовым полем.

F-ES Sitecore

Что вы делаете, чтобы "заставить его гореть"? Если вы делаете что-то программно, то не делайте этого. Правильная последовательность заключается в том, что вы прикрепляете измененное событие при загрузке страницы, после того как загрузка страницы завершится, .net определит, какие события нужно запустить, и когда он обнаружит, что ваше текстовое поле изменилось (через смесь формы и состояния представления), он вызовет измененное событие, и как вы прикрепили его при загрузке страницы, все это должно просто работать.

Ray Fischer

Привет F_ES,

Да, это тоже было мое понимание. Проблема в том, что он все еще не стреляет. Событие, с которым я связываю EventHandler, - это OnChange. Я не пытаюсь запустить его программно. Он действительно обнаруживает, что мой text_box был chagnged и выполняет обратную передачу. Но ist просто не дотягивается до EventHandler. ---Рэй

Ray Fischer

Извините F_ES, я все-таки заставил его выстрелить. Сразу после того, как я ответил на ваш комментарий, я увидел решение Ричарда, и оно сработало. Теперь я бегу дальше. Сработало отлично. Спасибо за поддержку и помощь.

1 Ответов

Рейтинг:
7

Richard Deeming

Цитата:
txtBxNm.Attributes.Add("OnChange", "TextBox_TextChanged");
Вы устанавливаете клиентский "изменить" обработчик функция JavaScript вызывается TextBox_TextChanged Эта функция Javascript не существует.

Вы уже прикрепили серверный обработчик событий в следующей строке. Вам просто нужно удалить Attributes.Add линия.


Ray Fischer

Спасибо, Ричард, это сработало. В некоторых примерах онлайн, которые я видел о программно созданных элементах управления, они имели как EventHandler, так и создание атрибута, перечисленные как необходимые для созданного объекта управления (?). Отличная поддержка, чувак.