Передать данные пользовательским компонентам в asp.net

Здесь .net 2.0, а не MVC, и я лажу с asp-формами.

У меня есть страница с пользовательскими элементами управления. Когда я нажимаю что-то на странице, я хочу загрузить пользовательский элемент управления на основе параметра со страницы.

Я не могу это сделать.

На моей странице FaultTree_Clicked я получаю значение, а затем:

  • Я попытался открыть свойство дочернего пользовательского элемента управления, чтобы установить значение, которое я установил в FaultTree_Clicked, оно забыто.

  • Я попытался сохранить его в Session["mykey"] и загрузить Session["mykey"] в Page_init элемента управления... значение пустое.

  • Я попытался сохранить его в ViewState["mykey"] и загрузить ViewState["mykey"] в Page_init элемента управления... значение пустое.

РЕДАКТИРОВАТЬ: более конкретная информация:

Вот урезанная версия того, как выглядит страница (MyFault):

<form id="form" runat="server">
 <div id="faulttree">
   <asp:TreeView ID="FaultTree" ......>
 </div>
 <uc1:_DefectDetail ID="DefectDetail" runat="server" Visible="true" EnableViewState="true" />
</form>

И в коде страниц есть метод, стоящий за "FaultTree_SelectedNodeChanged()".

Когда этот метод срабатывает, я хочу загрузить/показать элемент управления DefectDetail. Для DefectControl требуется идентификатор ошибки, который исходит от Дерева, который я успешно получаю в методе SelectedNodeChanged. Я не могу получить неисправность в контроль дефектов.


person dalyons    schedule 21.04.2009    source источник


Ответы (2)


Это связано с жизненным циклом страницы ASP.NET. К моменту возникновения события click событие инициализации элемента управления уже произошло.

Чтобы помочь вам, предоставьте более подробное объяснение того, что такое элемент управления FaultTree, каков желаемый результат и некоторый пример кода.

ОБНОВЛЕНИЕ:

Вместо общедоступного свойства вы можете просто создать общедоступный метод в элементе управления, который выполняет желаемое действие, и вызвать его из FaultTree_SelectedNodeChangeEvent.

Пример (для общедоступного метода Refresh):

_DefectDetail.Refresh(object data);
person Jose Basilio    schedule 21.04.2009
comment
ааа! это все, что мне нужно было сделать!! хаха. Огромное спасибо. Если я устанавливаю свойство ошибки в функции обновления, я замечаю, что оно пусто к тому времени, когда я вызываю другой метод для этого элемента управления. Поэтому я поместил ошибочный идентификатор в скрытое поле, которое обновляется при обновлении. это путь? Я думаю, это может быть из-за того, что мой объект ошибки не сериализуем. - person dalyons; 21.04.2009

В основном вы должны использовать EventHandlers....

        1. Add a event handler to your user control (I had a search bar UscSearchCriteriaBar1)      

        public event EventHandler CriteriaChanged;

        +


        private void InternalOnCriteriaChanged()
        {
        OnCriteriaChanged();
        }
        +
        protected virtual void OnCriteriaChanged()
        {
        // If there are registered clients raise event
        if (CriteriaChanged != null)
        CriteriaChanged(this, EventArgs.Empty);
        }
        +
        Example
        public int EmployeeID
        {
        get
        {
        f (Session["EmployeeID"] != null)
        {
        ViewState["EmployeeID"] = Convert.ToInt32(Session["EmployeeID"]);
        }
        if (ViewState["EmployeeID"] == null)
        ViewState["EmployeeID"] = 0;
        return int.Parse(ViewState["EmployeeID"].ToString());
        }
        set
        {
        ctlEmployee.SelectedValue = value.ToString();
        ViewState["EmployeeID"] = value;
        Session["EmployeeID"] = value;
        }
        }


        In your page or other control


        override protected void OnInit(EventArgs e)
        {
        InitializeComponent();
        UscSearchCriteriaBar1.CriteriaChanged += new EventHandler(this.CriteriaChanged);    
        base.OnInit(e);
        }

        private void CriteriaChanged(object sender, EventArgs e)
        {
        try
        {
RefreshData();
        }
        catch (Exception ex)
        {
        ExceptionManager.Publish(ex);
        }
        }

    You can get UscSearchCriteriaBar1.EmployeeID

Этот код должен дать вам некоторые идеи... это было сделано для 1.1, должно работать и на 2.

person abmv    schedule 21.04.2009