2009-03-31 4 views
0

저는 매우 간단한 usercontrol, 기본적으로 텍스트 상자와 레이블을 가지고 있습니다.이 목적은 서로간에 토글하는 것입니다. 컨트롤은 페이지의 Page_Load event 동안 바인딩됩니다. UserControl의 Page_Load 이벤트에서 Toggle() 함수를 호출합니다.이 함수는 적절한 컨트롤을 표시하거나 숨기고 부울 Editable 속성과 문자열 Text 속성을 기반으로 텍스트를 설정합니다.UserControl Textbox는 상태를 유지하지 않습니다.

Public Sub Toggle() 
    If Editable Then 
     txtText.Visible = True 
     lblText.Visible = False 
     txtText.Text = Text 
     txtText.CssClass = TextboxCSSClass 
    Else 
     txtText.Visible = False 
     lblText.Visible = True 
     lblText.Text = Text 
     lblText.CssClass = LabelCSSClass 
    End If 
End Sub 

내 문제는 간단하다 : 여기

내 토글() 메소드 (편집 및 텍스트되는 공용 속성을 기억)의 페이지에 버튼 컨트롤의 전환() 메소드, 토글 링 작업을 호출 할 때 좋아,하지만 텍스트가 사라집니다! 내가 옆에있는 일반 언 바운드 텍스트 상자를 사용하여이 시도했다 및 텍스트 상자를 잘 텍스트 값을 유지 관리합니다. 내가 빠진 것이 있습니까?

미리 도움을 주셔서 감사합니다.

+0

loadcontrol을 사용하여 usercontrol을로드합니까? – AndreasN

+0

아니요. 컨트롤이 .aspx 페이지에 등록되어 있습니다. – Jason

답변

0

나는 그것을 알아 냈다! 나는 멍청한 것에 대해 사과한다. 여기 내가 잘못하고있는 일이있다. 텍스트 속성에 대한 내 Get/Set가 비공개 멤버에 저장되고있다. 즉, 텍스트가 업데이트되었을 때 텍스트 상자에 연결되지 않았으므로 알 수 없습니다.

Public Property Text() As String 
    Get 
     Return txtText.Text 
    End Get 
    Set(ByVal value As String) 
     txtText.Text = value 
    End Set 
End Property 

내 Page_Load 이벤트에서 : 대신에, 나는 다음과 같은 한

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If Not IsPostBack Then 
     lblText.Text = Text 
     Toggle() 
    End If 
End Sub 

을 지금은 잘 작동합니다! 나를 올바른 길로 인도하는 사람들 덕분에! :)

0

컨트롤의 visible 속성을 False로 설정하면 Html로 렌더링되지 않으므로 페이지간에 상태를 전달할 수 없습니다. 대신 MultiView 컨트롤 사용을 고려하십시오

+0

컨트롤 자체는 visible = false로 설정되지 않습니다. 컨트롤의 Text 속성은 포스트 백을 통해 값을 유지해야합니다 (맞습니까? – Jason

+0

아니요, 표시를 false로 설정 했으므로 텍스트 상자는 포스트 백을 통해 상태를 유지하지 않습니다. 컨트롤에서해야 할 일은 MultiView를 만들고 두 개의 뷰를 만드는 것입니다. 첫 번째보기에서는 텍스트 상자를 두 번째 레이블에 넣습니다. 그렇다면 MV의 ActiveViewIndex를 변경해야합니다. Editabl – Ender

+0

오른쪽이지만 다시 볼 수있게 설정 한 후에 텍스트 속성을 설정합니다. USERCONTROL의 Text 속성은 유지되어야합니다. 텍스트 상자의 Text 속성을 이해합니다. UserControl은 유지하지 말아야하지만 UserControl은 유지해야합니다. 제 의견으로는, 적어도 :) 맞습니까? – Jason

0

업데이트 : 의견에 대한 자세한 정보.

viewstate를 사용하지 않도록 설정하고 텍스트 상자에 텍스트를 설정하면 텍스트가 입력 컨트롤에있는 텍스트가됩니다. 주어진 텍스트 상자의 값이 변경되었는지 알려고 할 때 일반적이지 않은 시나리오에서 영향을 줄 수 있습니다.

위의 내용은 입력 컨트롤이 아니기 때문에 라벨에 따라 다릅니다. viewstate가 비활성화 된 상태에서 모든 요청에 ​​텍스트를 설정하지 않으면 초기 값이 표시됩니다 (시도해보십시오). viewstate는 자동으로 컨트롤의 포스트 백에 대한 정보를 유지할 수있게합니다.

레이블과 함께 발생하는 것처럼 사용자 정의 컨트롤에서도 발생합니다. 두 컨트롤 텍스트를 직접 설정하도록 설정자를 변경하면 viewstate를 사용하는 경우 내부 컨트롤에 값이 유지됩니다. 라벨을 끄면 텍스트 상자와 라벨이 다르게 동작합니다.

viewstate를 끄면 Visible 구성에도 영향을줍니다. viewstate를 많이 해제했지만 컨트롤 정보를 포스트 백 전체에 걸쳐 실제로 유지하려는 시나리오가있을 수 있습니다. viewstate를 끄는 경우! IsPostBack 일 때뿐만 아니라 항상 컨트롤을 구성해야합니다.

Visible 및 코드의 텍스트를 추적하는 경우 내부 컨트롤의 viewstate를 끌 수 있습니다 (다른 속성을 할당하지 않은 경우).


초기 대답 :

당신은 라벨/텍스트 상자에 텍스트 속성의 현재 값을 할당한다. 현재 요청에서 값을 설정하지 않았다면 기본값을 가지므로 빈 텍스트가 나타납니다.

당신은 (C#을 구문)로 viewstate가의 값을 저장할 수 있습니다

public string Text 
{ 
    get 
    { 
     return (string) ViewState["MyText"]; 
    } 
    set 
    { 
     ViewState["MyText"] = value; 
    } 
} 

시를. 이것이 그 일을하는 유일한 방법은 아닙니다.토글이 텍스트를 설정하지 않았지만 setter에서 두 컨트롤 모두에 대해 수행 한 경우 값을 유지합니다 (페이지로드와 같이 viewstate가 추적 된 후에 사용자 정의 컨트롤의 Text 속성을 할당하는 한)).

+0

이 viewstate 사용하여 무엇입니까? 프로필보기/편집 목적으로이 컨트롤을 사용하고 싶습니다 ... 내 애플 늪지 않을 것이라고? 왜 UserControl의 텍스트 집합을 포스트 백간에 작동하지 않습니다? – Jason

+0

죄송합니다. 코드 샘플 다음에 텍스트가 누락되었습니다. isPostBack이 아닌 다른 컨트롤 (텍스트 상자 등)과 마찬가지로 Page_Load에 Text 속성을 설정합니다. 사용자 컨트롤이 어떻게 든 특별합니까? – Jason

+0

@ Jason은 그것에 대해 더 자세히 설명하는 업데이트를 추가했습니다. – eglasius

관련 문제