2014-09-28 6 views
1

Я пытаюсь создать настраиваемый компонент. Компонент должен динамически инициализироваться в коде. Компонент представляет собственное окно, содержащее другие компоненты, такие как поля даты, поля раскрывающегося списка и т. Д. Я получил свой класс из Ext.Net.Window и добавил простой DateField. Дату следует использовать при нажатии кнопки на сервере (дата не должна передаваться через параметр DirectMethod). Когда я добавляю этот компонент для разметки, он отлично работает. Но когда я добавляю окно в код позади, значение поля даты не устанавливается после вызова сервера. Я создаю окно в жизненном цикле в событии OnInit с помощью «Controls.Add (mywindow)». Было бы здорово, если бы кто-нибудь мог дать мне подсказку. Вот мой код окна (onExecuteButtonClick просто вызывает метод прямого и скрывает окно):Динамическая инициализация компонента Ext.Net

public sealed class WindowFilterComponent:Window 
{ 
    private const string Script = "MyProject.JavaScript.src.WindowFilterComponent.js"; 

    public override string InstanceOf 
    { 
     get 
     { 
      return "MyProject.Filter.WindowFilterComponent"; 
     } 
    } 

    public override string XType 
    { 
     get 
     { 
      return "windowfiltercomponent"; 
     } 
    } 

    private Button _btnExecute; 

    private Button _btnCancel; 

    private DateField _dateField; 


    protected override void OnInit(EventArgs e) 
    {  
     AutoHeight = true; 
     _btnExecute = new Button("Execute Export"); 
     _btnExecute.Listeners.Click.Handler = string.Format("#{{{0}}}.onExecuteButtonClick()", ID); 
     _btnCancel = new Button("Cancel"); 
     _btnCancel.Listeners.Click.Handler = string.Format("#{{{0}}}.onCancelButtonClick()", ID); 
     Buttons.Add(_btnExecute); 
     Buttons.Add(_btnCancel); 
     _dateField = new DateField(); 
     Items.Add(_dateField); 
     base.OnInit(e); 
    }  

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     if (ExtNet.IsAjaxRequest || Page.IsCallback) return; 
      ResourceManager.GetInstance().AddDirectMethodControl(this); 
    } 

    [DirectMethod(ShowMask = true)] 
    public void ExecuteClick() 
    { 
     var date = _dateField.SelectedValue;    
    } 
} 

Теперь Useage на моей странице в случае OnInit:

protected override void OnInit(EventArgs e) 
{  
    var myWindow = new WindowFilterComponent() 
      { 
       Hidden = false, 
       Width = 500    
      }; 
    myWindow.ID = myWindow.ID + "MyComponent"; 
    Controls.Add(myWindow); 
    base.OnInit(e); 
} 
+0

Если вам нужен код, пожалуйста, дайте мне знать :) – xandi1987

+0

может показать ваш класс, который получил окно – sakir

+0

Я добавил класс на вопрос – xandi1987

ответ

1

Я думаю, что окно оказывается за пределами форма.

Пожалуйста, замените

Controls.Add(myWindow); 

с

Form.Controls.Add(myWindow); 

Кроме того, я бы рекомендовал установить четкие идентификаторы для submittable полей (DateField в вашем случае), чтобы гарантировать, что идентификатор ключа из данных POST будет соответствовать идентификатору элемента управления на сервере.

+0

Спасибо большое :) Я рад сказать ... Проблема решена :) – xandi1987

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