문제

사용할 때 문제가 있습니다 LoadControl( type, Params ). 설명하겠습니다 ...

매우 간단한 사용자 컨트롤 (ASCX)이 있습니다.

<%@ Control Language="C#" AutoEventWireup="True" Inherits="ErrorDisplay" Codebehind="ErrorDisplay.ascx.cs" EnableViewState="false" %>

<asp:Label runat="server" ID="lblTitle" />
<asp:Label runat="server" ID="lblDescription" />

코드 (c#) 뒤에 :

public partial class ErrorDisplay : System.Web.UI.UserControl
{

    private Message _ErrorMessage;    

    public ErrorDisplay()
    {
    }

    public ErrorDisplay(Message ErrorMessage)
    {
        _ErrorMessage = ErrorMessage;
    }    

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        if (_ErrorMessage != null)
        {
            lblTitle.Text = _ErrorMessage.Message;
            lblDescription.Text = _ErrorMessage.Description;
        }
    }
}

내 웹 애플리케이션의 다른 곳에서는 다음 코드를 사용하여 USERCONTROL 인스턴스를 페이지에 추가합니다.

divValidationIssues.Controls.Add(LoadControl(typeof(ErrorDisplay), new object[] { MessageDetails }));   

메시지 매개 변수를 생성자로 전달하려면 과부하 된 버전의 LoadControl 버전을 사용하고 있습니다. 이 모든 것 나타납니다 OK 작업.

그러나 언제 OnPreRender() errordisplay usercontrol에서 해고되어 LBltitle 및 lbldescription 변수는 둘 다입니다. null, 마크 업에 해당하지만. 메시지 변수가 올바르게 모여 있습니다.

누구든지 왜 이런 일이 일어나고 있는지에 대해 빛을 발할 수 있습니까?

감사

편집하다:

명확성을 위해서는 버튼 프레스에 응답하여 USERCONTROL을 프로그래밍 방식으로 추가하는 코드가 실행 중이므로 '호스팅 페이지'가 init, page_load를 통해 진행되었으며 이제 이벤트 처리기를 처리하고 있습니다.

버튼 클릭 이벤트에 응답하여 생성 될 때 초기 ASP 라이프 사이클 단계에서 USERCONTROLS를 추가 할 수 없습니다.

도움이 되었습니까?

해결책

다음 코드도 시도했습니다. 동일한 결과를 얻는다 (즉, LBltitle과 LBldescription은 모두 null).

protected void Page_Load(object sender, EventArgs e)
{
    if (_ErrorMessage != null)
    {
        lblTitle.Text = _ErrorMessage.Message;
        lblDescription.Text = _ErrorMessage.Description;
    }
}

로드 컨트롤 함수가 포함되는 페이지의 현재 '상태'로로드되는 컨트롤을 가져 오는 것을 이해했습니다. 따라서 init, page_load 등은 모두 loadcontrol 호출의 일부로 실행됩니다.

흥미롭게 도이 (답이없는) ASP.NET 포럼 포스트는 내가 경험 한 것과 동일한 문제를 보여줍니다.

MSDN 포럼 게시물

또한 - MSDN에서 :

컨트롤을 컨테이너 컨트롤에로드하면 컨테이너는 현재 이벤트를 따라갈 때까지 추가 된 모든 컨트롤의 이벤트를 올립니다. 그러나 추가 된 컨트롤은 Postback 데이터 처리를 따라 잡지 않습니다. 유효성 검사를 포함하여 Postback 데이터 처리에 참여할 추가 제어가 있으려면로드 이벤트가 아닌 INIT 이벤트에 컨트롤이 추가되어야합니다.

따라서로드 컨트롤이 제어를 올바르게 비활성화해서는 안됩니까?

편집하다:

좋아, 그래서 나는 여기서 내 질문에 대답하고있다 ..

위에 링크 된 포럼 게시물의 답변 버전을 찾았습니다. 여기

본질적으로 대답은 LoadControl( type, params ) 'Page Infront'ASCX를 구문 분석으로 추론 할 수 없으므로 컨트롤을 사용하지 않습니다. 당신이 사용할 때 LoadControl( "ascx path" ) 버전에는 페이지가 주어 지므로 모든 구문 분석 및 비화를 수행합니다.

따라서 요약하면 제어를 비활성화하는 코드를 변경하여 별도의 부품으로 분할해야합니다. 즉

Control ErrorCntrl = LoadControl("ErrorDisplay.ascx");
ErrorCntrl.ID = SomeID;
(ErrorCntrl as ErrorDisplay).SetErrorMessage = MessageDetail;
divErrorContainer.Controls.Add(ErrorCntrl);

그리고 그것은 괜찮을 것입니다 .. 그것은 나의 이전 시도만큼 깔끔하지는 않지만 적어도 그것은 효과가 있습니다.

나는 여전히 위의 것을 개선하기위한 제안에 개방되어 있습니다.

건배

다른 팁

Mitchel과 동의하면 컨트롤을 완전히 사용할 수있는 후에 발사되는 제어 코드 자체에 page_load를 넣을 수 있어야합니다.

글쎄, 당신이 생성자를 실행하고 페이지에 컨트롤을 추가 한 후에는 항상 자신의로드 이벤트를 추가하고 호출하지만 스타일의 이유로 선택할 수는 있지만 가지고있는 것과 크게 다르지 않습니다.

문제에 대한 답을 찾아서 다행입니다!

여기 Steven Robbins가 작성한 블로그 게시물입니다. 게시물은 사용자 컨트롤을 사용하여 매개 변수를 전달하는 방법을 설명합니다. LoadControl, 무엇과 비슷합니다 LoadControl(Type, object[]) 할것이다, 작동하는 것을 제외하고 :)

E.Cell.Controls 컬렉션에 사용자 컨트롤을 추가하고 싶다는 점에서 Calendar Control Dayrender 이벤트와 비슷한 문제가있었습니다. 사용자 컨트롤 Page_load가 발생하지 않거나 ASCX의 Listbox가 Null Exception을 던지는 몇 가지 실패한 접근 방식을 시도한 후 LoadControl (ASCX)으로 양식에 대한 제어를 초기화 한 다음 Markup 컨트롤에 액세스하기 시작하면 ASCX, 모든 것이 잘 작동했습니다. 이 접근법은 ASCX의 Page_load 이벤트에 전혀 의존하지 않습니다.

ASCX 마크 업

뒤에 코드

공개 클래스 CPCALENDARCELL SYSTEM.WEB.UI.USERCONTROL을 상속합니다

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

End Sub

Public Sub Add(txt As String)
    Dim li As New ListItem(txt, txt)
    lstDay.Items.Add(li)
End Sub

수업 종료

페이지 ASPX 마크 업

양식의 Calendar Dayrender 이벤트 뒤에 코드

Private Sub Calendar1_DayRender(sender As Object, e As System.Web.UI.WebControls.DayRenderEventArgs) Handles Calendar1.DayRender
    Dim div As CPCalendarCell = LoadControl("~/UserControls/CPCalendarCell.ascx")
    div.ID = "dv_" & e.Day.Date.ToShortDateString.Replace(" ", "_")

    **e.Cell.Controls.Add(div)**

    div.Add(e.Day.Date.Month.ToString & "/" & e.Day.Date.Day.ToString)
    div.Add("Item 1")
    div.Add("Item 2")
    e.Cell.Style.Add("background-color", IIf(e.Day.IsWeekend, "whitesmoke", "white").ToString)
End Sub

ASP.NET 페이지 라이프 사이클에 따라 컨트롤이 사전 렌더에 완전히 추가되지 않았습니다. Page_Load에 값을로드하지 않겠습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top