2012-03-29 4 views
2

프로그래밍 방식으로 cs 파일에서 aspx 페이지의 컨트롤에 액세스하려면 어떻게해야합니까?프로그래밍 방식으로 cs 파일에서 aspx 페이지의 컨트롤에 액세스하는 방법

예를 들어, 도시 (ID = "atlanta", id = "chicago", id = "pittsburgh"등)로 명명 된 ID로 각각 asp : Panel 컨트롤을 설정 한 다음 CS는 데이터베이스에서 컨트롤 이름과 일치하는 값을 사용하여 무엇을 사용할 수 있습니까?

표시된대로 FindControl()을 사용하려고했는데 null을 반환합니다.

aspx 페이지 :

<asp:Panel ID="atlanta" runat="server" Visible="false"></asp:Panel> 

CS 파일 :

controlName = storeLocation.City.ToLower(); 
Panel cityPanel = (Panel)FindControl(controlName); 
cityPanel.Visible = true; 

나는의 FindControl()는 당신이 ItemTemaplate 전달 리피터 또는 그리드 같은 경우에 사용하기 위해 정말 가정합니다. 내 경우에는 그 안에 일련의 패널이있는 콘텐츠 태그가있는 단순한 콘텐츠 페이지입니다.

고맙습니다. :)

+0

내 대답을 확인 했습니까? 내 컴퓨터에서 해봤지만 제대로 작동하는 것 같습니다. 궁금해... – daniloquio

답변

3

FindControl()은 재귀가 아니므로 문제가 될 수 있습니다. 그러나 this one과 같은 재귀 버전의 많은 구현이 있습니다.

동적으로 패널을 만들고 페이지 수명주기의 후반부에 액세스하려는 경우 ID가 키인 Dictionary<string, Panel>에 모두 패널을 추가 할 수 있습니다.

+0

고마워, 이건 분명히 효과가있다. 다른 사람들이 지적했듯이 재귀가 과세 될 수 있지만 현재 상태의 aspx 페이지 구조는 문제가되어서는 안됩니다. 변경되고 더 복잡 해지면 문제가 될 수 있지만이 페이지가 복사/텍스트 이외의 것으로 변경되는 것을 예견하지 않습니다. – Dmase05

+0

다행입니다. 모든 항목의 직접적인 부모를 알고 있다면 재귀를 피할 수 있지만 그렇지 않으면 걱정할 필요가 없습니다. 몇 가지 수준의 통제를 통한 재귀는 매우 저렴합니다. –

2

당신은 재귀 적으로 컨트롤을 찾기 위해이 확장 방법을 사용할 수 있습니다 : 코드에서

public static class ControlExtension 
{ 

    public static IEnumerable<Control> GetAllControls(this Control parent) 
    { 
     foreach (Control control in parent.Controls) 
     { 
      yield return control; 
      foreach (Control child in control.GetAllControls()) 
      { 
       yield return child; 
      } 
     } 
    } 
} 

그리고 페이지의 뒤에 당신이 당신의 라벨 접두사 경우이 같은 뭔가를 할 수 :

IEnumerable<Control> city_controls = this.GetAllControls().Where(x => x.Id.Contains("city_")) 

또는를 단일 제어 :

var city = this.GetAllControls().Single(x => x.Id = "atlanta"); 

this이 ASPX 코드 뒤에입니다 페이지.

그것은 또한 패널 등의 컨트롤 작동, 그래서 당신은 패널 내부의 모든 컨트롤을 찾으려면 등

1

당신이 포함 된 컨트롤을 알고 있다면 당신이 찾는 그 제어의 FindControl() 기능을 사용할 수 있습니다 그것. 이 메서드는 재귀 메서드를 사용하는 것보다 훨씬 빠르고 안전합니다.

Microsoft는 특정 이유로 재귀 FindControl() 함수를 포함하지 않았으므로 더 많은 컨트롤이 페이지에 추가됨에 따라 시간이 지남에 따라 페이지가 느려집니다. 작동하지 않는 경우 다른 응답과 마찬가지로 재귀 함수를 사용하십시오.

+0

이 문제도 발생합니다. 포함 된 내용 자리 표시 자에서'FindControl()'을 수행하면 null도 반환됩니다. – Dmase05

1

패널이 asp : Content 컨트롤에 중첩되어 있기 때문에 이는 효과가 있습니다.

Panel cityPanel = 
(Panel)Master.FindControl("ContentPlaceHolderId").FindControl(controlName); 

물론, ContentPlaceHolderId는 구현중인 마스터 페이지에서 해당 ContentPlaceHolder의 ID입니다.

+0

작동하지 않습니다. 그래서 영문이있는 경우 : ' 나는 CS이 있어야한다' : '패널 concentrationPanel = (패널) MasterController ("cphInteriorBody"). FindControl (controlName); ' – Dmase05

+0

@ DMase05 네가 사용했던 방식이고 네가 잘 해줬는데 미안하다. 다른 대답에서 말했듯이, 재귀가 확실히 작동합니다. – daniloquio

+0

그래, 나는 그것이 잘 작동하기를 기대하면서 나는 이것에 정말 당황 스럽다. 어쨌든 고마워! – Dmase05

관련 문제