2010-04-20 2 views
2

Я расширяю элемент управления textBox, и я хочу вызвать функцию javascript в OnLoad (EventArgs e). Как я могу это сделать?расширение C# текстовое поле управления asp.net

public partial class MyTextBox: TextBox 
{ 
protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     //call to a javascript function?    
    } 
} 
+1

Что вы пытаетесь достичь? Вы задаете вопросы, связанные с концепциями клиентской и серверной сторон. – Oded

+0

Я переформулировал свой вопрос. Теперь я надеюсь, что он станет более ясным. – scatman

+0

вызов любой функции javascript ... может быть, просто alert (''); – scatman

ответ

2

«» ввода HTML-элемент не имеет событие нагрузки. 'body', 'img' и 'window' do. Могут быть и другие.

Я предлагаю вам добавить класс css в пользовательские входы (текстовые поля), а затем использовать что-то вроде jQuery для обработки события загрузки страницы для выполнения вашей функции во всех текстовых окнах с этим классом css.

В следующем примере предполагается, что на вашей странице загружены jQuery и jQueryUI.

public class MyTextBox: TextBox 
{ 
    public string DatePickerOptions { get; set; } 

    public string DateFormatString { get; set; } 

    public string EmptyDateText { get; set; } 

    public DateTime? Date 
    { 
     get 
     { 
      DateTime? date = null; 

      if (string.IsNullOrEmpty(Text)) 
       return date; 

      DateTime outDateTime; 
      if (DateTime.TryParse(Text, out outDateTime)) 
       date = outDateTime; 

      return date; 
     } 
     set 
     { 
      DateTime? date = value; 

      if (date == null || ((DateTime)date).Year < 2) 
       Text = EmptyDateText; 
      else 
       Text = ((DateTime) date).ToString(DateFormatString); 
     } 
    } 

    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     Text = EmptyDateText; 
    } 

    public override void RenderEndTag(System.Web.UI.HtmlTextWriter writer) 
    {   
     StringBuilder javaScriptBuilder = new StringBuilder(); 
     javaScriptBuilder.Append("$(function() { $(\"#"); 
     javaScriptBuilder.Append(ClientID); 
     javaScriptBuilder.Append("\").datepicker("); 
     javaScriptBuilder.Append(DatePickerOptions); 
     javaScriptBuilder.Append("); });"); 

     base.RenderEndTag(writer); 
     writer.WriteLine(); 
     writer.Write("<script type=\"text/javascript\">"); 
     writer.WriteLine(); 
     writer.Indent++; 
     writer.Write(javaScriptBuilder.ToString()); 
     writer.WriteLine(); 
     writer.Indent--; 
     writer.Write("</script>"); 
     writer.WriteLine(); 
     writer.Close(); 
    } 
} 
+0

Если вы сообщите нам, что вы хотите, чтобы произойти с этими входами при загрузке страницы, мы могли бы дать вам четкий пример того, как ее достичь. – pmawhinney

+0

на самом деле то, что я пытаюсь сделать, прикрепляет календарь JQuery к MyTexbox. я сделал именно то, что вы сказали (добавив класс css ....), и все сработало нормально. но затем мне пришлось обновить некоторые календари определенных текстовых полей на странице (например, просто установить минимальные и максимальные даты или культуру для некоторых календарей). я не мог этого сделать, потому что это обновит значения всех календарей, доступных для всех текстовых полей, потому что все они имеют один и тот же css. и именно по этой причине я подумал о расширении текстового поля и загрузке календаря для каждого texbox, переопределив событие onLoad. – scatman

+0

Я рад, что вы ответили на мой вопрос. Я случайно создал один из них недавно. Пользовательский веб-элемент управления в приведенном выше примере даже позволит вам установить параметры выбора даты jQueryUI и строку формата даты. Надеюсь, поможет. – pmawhinney

0

Вы хотите перегружать OnLoad события (C#) с JavaScript? Я не думаю, что вы можете это сделать. Или вы хотите визуализировать javascript в событии OnLoad?

+0

no Я использую C# для переопределения метода, но я хочу вызвать функцию javascript внутри этого метода. – scatman

+0

http://stackoverflow.com/questions/1577859/asp-net-javascript-object-component-for-composite-control Пожалуйста, смотрите эту информацию из SO. Я думаю, это может вам помочь. –

0

Попробуйте это:

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 
    Response.Write("<script>your script</script>"); 
} 
1

Я думаю, что вы запутались ... Вы хотите сгореть яваскрипт функции в OnLoad случае текстового поля, верно? Тогда вы не должны делать это на стороне сервера, а на стороне клиента. Тем не менее, вам не нужно переопределять событие onload. Если вы добавите этот атрибут в конструктор, он должен сделать трюк! ;)

public class MyTextBox: TextBox 
{ 
    public MyTextBox() 
    { 
     this.Attributes.Add("OnLoad", "jsFunction();");   
    } 
} 
+0

Мне нужно сделать это во всех моих текстовых блоках на всех страницах, поэтому я подумал, что было бы намного лучше переопределить событие OnLoad, а не называть txtBox.Attributes.Add() на каждой странице для каждого текстового поля. – scatman

+0

Вы пробовали это все же? – pmmaga

+0

Да, я уверен, что это сработает, но вы указываете одно текстовое поле. как я уже сказал, у меня много текстовых полей в проекте, и я не могу просто установить атрибут для каждого текстового поля. Мне нужен способ установить атрибут для всех текущих texboxes (и будущих) в одном атрибуте. Именно поэтому я расширяю элемент управления текстовым полем ... – scatman

0
public partial class MyTextBox: TextBox 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e);  
     this.Attributes.Add("OnLoad","alert('Im Loaded!');");   
    } 
} 
+0

Я уже пробовал это. но это не сработало !! – scatman

1

на основе ваших ответов на Педро ММ подозревают, что вы хотите это:

public partial class MyTextBox: TextBox 
{ 
    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     Attributes.Add("OnLoad", "jsFunction();");    
    } 
} 

OnLoad (EventArgs е) это событие на сервере. Он не имеет никакого отношения к событию JavaScript OnLoad веб-страницы.

+0

это не сработало. Я протестировал его, выполнив: Attributes.Add («OnLoad», «alert (« ok! »);»); и запуск страницы, содержащей элемент управления MyTextBox, и предупреждения не было .... – scatman

+0

См. мой новый ответ: «В элементе ввода« html »нет события загрузки« – pmawhinney

0

Надежда я понял ваш вопрос правильно,

Вы можете использовать эту функцию Page.RegisterStartupScript метод, который позволит сделать ваш яваскрипта код, выполняемый сразу после загрузки страницы снова.

Больше информации и пример на MSDN http://msdn.microsoft.com/en-us/library/system.web.ui.page.registerstartupscript.aspx

+0

нет никакого RegisterStartupScript с частичным классом, который расширяет текстовое поле. thx в любом случае ... – scatman

Смежные вопросы