프로그래밍

ASP.NET 에서 동적으로 컨트롤을 할당, 포스트 백이 일어났을 경우, 사라지는 값?

  

이것 때문에 대체 얼마나 삽질을 해댔는지. 포스트 백만 일어나면 값이 사라졌다.
처음엔 값이 사라지는줄도 몰랐다. FindControl() 메소드도 null만 리턴해댔다.
값이 사라지는 것인지, 컨트롤이 사라지는 것인지 분간도 되지 않았다.

TextBox Property는 내부적으로 작성된 소스를 보게 되면 텍스트의 내용이 null일 경우, string.Empty를 리턴한다.
그래서 참조를 할 경우 참조 에러가 나게 된다.

한가지 더.
패널을 사용하여 각 패널에 컨트롤을 나누어 놓았을 때, Page_Load()의 패널.Visible=false로 설정되면,
페이지가 열릴 때, 해당 패널은 렌더링 되지 않는다.(-_ - 아놔..)
그래서 해당 패널에 동적으로 생성된 컨트롤이 존재 했다면 그 패널 컨테이너 안의 컨트롤은 FindControl()로 찾을 수가 없게 된다.

또 하나 중요한 것은. 웹 폼에서 포스트백 이후에는 변수의 값을 유지할 수가 없다.
그럴때에는 ViewState를 사용해서 값을 유지할 수 있으며, 정적 컨트롤 들은 내부적으로 ViewState를 사용하기 때문에 값이 유지된다. 하지만, 동적으로 생성된 컨트롤의 데이터는 ViewState에 저장이 되지만,
동적인 컨트롤 자체는 ViewState에 저장이 되지 않는다
. 즉 접근할 방법이 없어지므로,
FindControl()은 계속 null을 리턴하고, 접근이라도 할라치면 참조 오류가 나 버린다. 그러니 내가 알 리가 있나..

입력된 값을 가지고 동적으로 TextBox를 생성하고, 생성된 컨트롤로부터 값을 다시 얻어 합을 구한다고 가정.
먼저, 최초에 입력될 값을 보관할 ViewState를 설정한다.
이 설정은, 사용자로부터 값을 입력 받은 다음에 설정한다.

ViewState["TextBoxCount"] = nNumber; // ViewState로 생성된 TextBoxCount에 변수를 저장하여 보관.

다음으로 동적 할당할 TextBox Control을 코딩한 부분을 하나의 함수(메소드)로 묶어서 언제든지 호출 가능한 형태로 구분한다. 여기서는 DrawTextBox() 라고 가정하고, 간단하게 코딩하면 다음과 같다.

private void DrawTextBox()
{
 if(ViewState["TextBoxCount"] != null)               // null이 아니면 값이 할당되었다는 의미
 {
  nNumber = (int)ViewState["TextBoxCount"];     // 캐스팅 하여 본래 값을 복원
  for (int i=1; i<=nNumber; i++)
  {
   Literal li = new Literal();
   li.Text = "<br>" + i + "번째 텍스트 박스 : ";
   Panel2.Controls.Add(li);

   TextBox txt = new TextBox();
   txt.ID = "txt"+i.ToString();
   txt.Width = 80;
   Panel2.Controls.Add(txt);
  }
 }
}

이런식으로 하여 ViewState에 TextBox의 개수를 저장하고,
Page_Load 에서 ViewState 에 값이 있다면 매 페이지마다 다시 컨트롤을 추가해야 한다.

private void Page_Load(object sender, System.EventArgs e)
  {
      DrawTextBox();
  }

그러한 방법으로 TextBox의 값을 유지할 수 있게 된다.
3일동안 삽질했다. 아놔 -_ ㅜ

신고
  1. 콩나무 수정/삭제 답글

    고맙습니다ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ님 덕분에 하루만 삽질했어요ㅜㅜㅜㅜ

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.