Изменение внутреннего контроля в результате события - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть составной элемент управления, например:

class MyControl : CompositeControl {
   private Control _control1;
   private Control _control2;

   public bool RenderControl2 { get; set; }

   /* Constructor to initialize controls*/

    protected override void CreateChildControls(){
       if(RenderControl2){
           Controls.Add(_control2);
       }else{
           Controls.Add(_control1);
       }           
    }        
}

Это прекрасно работает в сценариях, где значение RenderControl2 устанавливается во время Page_Init ().

 protected void Page_Init(object sender, EventArgs e){
    if (!Page.IsPostBack){
       myControl.RenderControl2 = MyMagicFucntion();
    }
    /* Works also when in Postback, but not required since the control keeps it state and only need to change state in the scenario below.*/
}

Однако теперь мы будемнравится устанавливать значение в результате события

protected void otherDropDow_SelectedIndexChanged(object sender, EventArgs e) {
    myControl.RenderControl2 = otherDropDown.SelectedValue == "My Magic String";
}

Это не работает, так как элемент управления уже выполнил CreateChildControls к моменту запуска события.(Ну, это работает во время следующей обратной передачи ... :()

Я попытался переместить логику в событие OnDataBinding элемента управления. Но это, похоже, не влияет на то, как на самом деле показывает элемент управленияна странице.

/* DOES NOT RESOLVE THE ISSUE */
protected override void OnDataBinding(EventArgs e){  
   base.OnDataBinding(e);
   /* _renderControl2HasChanged is set when RenderControl2 changes value          
   */
   if(_renderControl2HasChanged)
      if(RenderControl2){
          Controls.Remove(_control1);
          Controls.Add(_control2);
      }else{
          Controls.Remove(_control2);
          Controls.Add(_control1);
      }
   }      

1 Ответ

0 голосов
/ 20 февраля 2019

Вместо принятия решения о том, какой элемент управления отображать в CreateChildControls, вы можете оценить флаг в OnPreRender и изменить только видимость дочерних элементов управления, например:

protected override void CreateChildControls()
{
   Controls.Add(_control1);
   Controls.Add(_control2);
}     

protected override void OnPreRender(EventArgs e)
{
   _control1.Visible = !RenderControl2;
   _control2.Visible = RenderControl2;
}

Кроме того,Вы должны сохранить значение RenderControl2 в состоянии управления, как описано там .Таким образом, это будет сохраняться через постбэки.

...