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, я все-таки заставил его выстрелить. Сразу после того, как я ответил на ваш комментарий, я увидел решение Ричарда, и оно сработало. Теперь я бегу дальше. Сработало отлично. Спасибо за поддержку и помощь.