2009-12-29 3 views
3

오래 기다렸던 게시물에 대해 사과드립니다.하지만 빌드중인 .NET 페이지에 문제가 있습니다.페이지 포스트 백에서 동적 CheckBox의 'Checked'속성 읽기

최종 질문 : Page_Load 서브 루틴 중에 동적으로 생성 된 체크 박스의 'Checked'속성을 어떻게 확인할 수 있습니까?

세부 사항 : 기본적으로 사용자가 선택한 숫자에 따라 동적으로 테이블 행을 만드는 VB.NET 페이지가 있습니다. 예를 들어, 사용자가 드롭 다운 목록에서 "3"을 선택하면 페이지가 다시 게시되고 세 개의 테이블 행이 만들어집니다. 각 행에는 두 개의 텍스트 상자, 드롭 다운 목록 및 확인란 (일반 HTML 컨트롤 대신 .NET 폼 컨트롤이 모두 나와 있음)을 포함합니다.

일반적으로 사용자는 양식 컨트롤에 몇 가지 세부 정보를 입력하고 '제출'버튼을 클릭하면 페이지가 각 행을 반복하고 SQL Server 테이블에 데이터가 삽입됩니다.

그러나 사용자가 해당 행에 대한 확인란을 선택하면 페이지가 해당 행을 무시하고 사용자가 '제출'을 클릭 할 때 데이터 행을 데이터베이스에 삽입하지 않음을 나타냅니다.

이 방법은 정상적으로 작동하지만 문제가 있습니다. 사용자가 '제출'을 클릭하고 양식 컨트롤에 입력 된 값 중 일부가 유효하지 않은 경우 (예를 들어 사용자가 이름을 입력하지 않은 경우) 페이지는 데이터를 제출하지 않고 대신 오류를 표시합니다 사용자에게 변경해야하는 값을 알립니다. 그러나 사용자가 예를 들어 3 개의 행을 생성하지만 세 번째 행을 무시하도록 결정한 경우 (확인란을 선택하여) 페이지가 다시 게시 될 때 잘못된 항목이 발견되고 양식을 사용자에게 다시 표시하여 허용합니다 오류를 수정하려면 페이지가 제 3 행을 모두 렌더링하지 않았 으면합니다. 결국, 그들은 원래 3 개의 행을 만들기로 결정했지만 그 다음에 2 개의 행만 필요하다고 결정했습니다. 따라서 세 번째 행이 재생성되지 않는다는 것은 의미가 있습니다. 내 를 Page_Load에서 서브 루틴을 다음과 같은, 단순히 사용하는 코드로 시작하려면

:

If objCheckbox.Checked = False 
    ' Render the row, and recreate the dynamic controls ' 
Else 
    ' Dont render the row or any of the controls ' 
End If 

그러나 심지어 항상 거짓를 반환했다 objCheckbox.Checked이었다 일어날 것 같았다 무엇 체크 박스가 체크 된 경우. 페이지가로드되면 테이블 행이 다시 렌더링되고 체크 상자에 체크 표시가 나타 났으므로 값이 포스트 백에서 손실 된 것과 같지 않습니다. 그러나 체크 박스가 체크되어 있는지 확인한 후에는 항상 False을 반환하여 사용자가 필요로하지 않는 테이블 행을 렌더링합니다.

누구든지이 문제를 해결하는 방법을 알고 있습니까? .NET ViewState 및 페이지 수명주기에 대한 기사를 많이 읽었지만 아직 작동하는 솔루션을 찾지 못했습니다. 일부 동적 컨트롤을 다시 만들기 전에 확인란에 체크 표시가되어 있는지 확인할 수 있어야합니다.

는 내가의 ViewState를 사용이 대체 코드를 시도했지만 아무 소용이 : '

System.Web.UI.Control :

If objIgnoreCheckbox.ViewState("Checked") = False Then ' Render the row, and recreate the dynamic controls ' Else ' Dont render the row or any of the controls ' End If 

이 일 때, 나는 다음과 같은 오류가 발생합니다 .Protected Overridable ReadOnly 속성 ViewState() As 'System.Web.UI.StateBag'은 '보호됨'이므로이 컨텍스트에서 액세스 할 수 없습니다.나는 기본적으로 다음

Public Class CheckboxControl 

    ' Inherits all Checkbox properties and methods ' 
    Inherits Checkbox 

    ' Create the public ViewState property '   
    Public Overrides ReadOnly Property ViewState As StateBag 

     Get 
      Dim objChecked As Object = ViewState("Checked") 
      If Not (IsNothing(objChecked)) Then 
       Return objChecked 
      End If 
     End Get 

    End Property 

End Class 

그러나 :

은 그래서 체크 박스에서 상속 사용자 정의 클래스를 만들려고하고,이 읽을 수 있도록, 그것을 공개하는의 ViewState 속성을 재정의하려 보호 된 회원을 공개로 무효화 할 수 없다는 사실을 알았습니다. 나는 새로운 수업 등을 만드는 것에 대한 경험이 거의 없었기 때문에 난 어려움을 겪는다.

아무도 나에게 darned 체크 박스를 확인하는 방법을 알려 줄 수 있다면, 나는 영원히 감사 할 것입니다! 나는 문제를 풀려고 노력하면서 하루를 보냈지만 운이 없었습니다!

미리 감사드립니다. 정적 컨트롤

답변

2

는 컨트롤의 뷰 상태 Page_Load 전에 일어나는, Page_Init 복원되고, 그래서 Page_Load 정확한 값을 포함한다. 자신의 viewstate가이 Page_Load에서 잘못된하고Page_Load을 복원되지만 이벤트 핸들러를 호출하기 전에 있도록 동적 컨트롤, Page_Load에 만들어집니다. MSDN says:

After the Page_Load event has run, but before control event-handling methods are called, the remaining view state information is loaded into the dynamically created controls.

문제가 해결되지 않습니다 CheckBox.ViewState의 가시성을 변경하는 이유는 왜 Checked false를 반환하고,.

솔루션 (테스트되지 않은,하지만 난이 일을해야한다고 생각) : 모든 컨트롤 만들기 (도 표시하지 않을 것) Page_Load에. CheckedChanged에있는 이벤트 핸들러를 CheckBoxes에 연결합니다 (Page_Load). Page_Load이 끝나면 ASP.NET은 새로 생성 된 컨트롤의 뷰 상태를 복원합니다. 따라서 ASP.NET에서 과 동일한 컨트롤을 Page_Load에 만들어서 컨트롤이 뷰 상태를 컨트롤에 올바르게 매핑 할 수 있습니다. ASP.NET은 변경된 CheckBox에 대한 이벤트 처리기를 호출합니다. 여기서 표시하지 않으려는 행을 제거 할 수 있습니다. 답장을 보내

Function MyCheckedChangedFunction(sender As Object, e As EventArgs) 
    Dim objCheckbox = DirectCast(sender, CheckBox) 

    ... access objCheckbox.Changed and do something useful here ... 
End Function 
+0

안녕하세요, 감사 :


이 당신이 이벤트 핸들러

AddHandler objCheckbox.CheckedChanged, AddressOf MyCheckedChangedFunction 

과 같이 보일 것입니다이 함수를 추가하는 방법입니다. 내가 제안한대로 Page_Load에서 생성되는대로 이벤트 핸들러를 체크 박스에 추가했습니다. 나는 다음과 같은 코드를 사용 : objCheckbox.OnCheckedChanged = "의 MyFunction" 는하지만 다음과 같은 오류가 : **가 'System.Web.UI.WebControls.CheckBox.Protected 재정의 하위 OnCheckedChanged (경우 System.EventArgs으로 전자) '이 (가)'보호됨 '이므로이 컨텍스트에서 액세스 할 수 없습니다. ** 이 오류의 원인은 무엇입니까? 이전에 언급했듯이이 오류가 발생하기 전에이 함수를 재정 의하여 public으로 만들 수 없습니다. 감사합니다. – Dom

+0

답을 업데이트했습니다. 이벤트 처리기를 추가하려면'On'없이'CheckedChanged'에 접근해야합니다 ...죄송합니다. 제 대답이 오해의 소지가 있다면. 몇 가지 예제 코드를 추가했습니다. – Heinzi

+0

안녕하세요, 의견 주셔서 감사합니다! ** CheckedChanged를 사용할 때 ** 다음 오류가 발생합니다 ** 'Public Event CheckedChanged (보낸 사람 객체, e As System.EventArgs)'이벤트이며 이벤트를 직접 호출 할 수 없습니다. 이벤트를 발생 시키려면 'RaiseEvent'문을 사용하십시오. ** 그러나 문제는 정렬 할 수있었습니다. ** Page_PreRender ** (작동) 동안 확인란의 상태를 확인하고 그 시점에서 양식에서 모든 행을 제거합니다. 그래도 답장을 보내 주셔서 감사합니다! – Dom

관련 문제