2009-04-07 9 views
1
의 ID를 처리하는 방법을

이 가능한 중복은 :
.Net Changes the element IDsASP.net 서버 컨트롤 : 동적 컨트롤

나는 다음과 같은 문제가 (나는 간단하게 설명 할 것이다, 그렇지 않으면 때문에 너무 복잡해 지거나 길어진다).

Panel에서 상속 된 ASP.net 서버 컨트롤을 만들어야합니다. 충분히 간단합니다. 사용자 정의 컨트롤이 렌더되면 동적으로 Button을 만들고 이벤트 핸들러를 서버 컨트롤에 연결하고 렌더링 된 컨트롤에이 버튼을 추가해야합니다. 서버 컨트롤 내부에 정의 된 click 이벤트 핸들러는 잠시 동안 재미 있지 않은 일부 작업을 수행합니다.

이미 예제를 코딩 했으므로 정상적으로 작동합니다. 서버 컨트롤의 생성자에서 새 단추 컨트롤을 만들고 ID를 부여하고 이벤트 처리기를 연결합니다. 서버 컨트롤의 OnInit에 Panel 컨트롤에 단추를 추가하고 (패널에서 상속 받음을 기억하십시오) 그런 다음 모든 것이 렌더링됩니다. 다음과 같이 표시됩니다.

public class MyCustomControl: Panel 
    { 
     private Button myButton; 

     public MyCustomControl() 
     { 
      myButton = new Button(); 
      myButton.ID = "btnTest"; 
      myButton.Click += new EventHandler(btnTest_Click); 
     } 

     protected void btnTest_Click(object sender, EventArgs e) 
     { 
      //do something... 
     } 

     //... 

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

      this.Controls.AddAt(0, myButton); 
     } 

     protected override void OnLoad(EventArgs e) 
     { 
      base.OnLoad(e); 
      //... 
     } 

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


     protected override void Render(HtmlTextWriter output) 
     { 
      base.RenderContents(output); 
     } 
    } 

매우 잘 작동합니다. 버튼이 올바르게 렌더링되고 클릭하면이 고객 서버 컨트롤 내부의 적절한 핸들러가 호출되어 실행됩니다. 그러나 문제는 그러나 생성 된 모든 단추가 동일한 ID "btnTest"를 가지므로이 서버 컨트롤의 여러 인스턴스를 내 페이지에 추가하려고 할 때 충돌이 발생합니다. 그래서 내가 시도한 것은 임의의 숫자를 버튼의 id, s.t에 연결하는 것입니다. 그것은 "btnTest1235512"또는 이와 유사한 것으로 끝납니다. 이것은 여러 ID로 내 문제를 해결하지만, 이벤트 처리기가 버튼을 클릭 할 때 더 이상 올바르게 호출되지 않는 문제가 발생합니다. 이 문제는 내 버튼이 항상 생성자에 입력 할 때 다른 ID를 가져오고 적절한 콜백 (btnTest_Click 이벤트 핸들러)이 없기 때문에 발생했다고 생각합니다.

누군가 내가이 문제를 어떻게 처리 할 수 ​​있는지 제안 해 줄 수 있습니까? 버튼의 ID를 기억하고 다시 연관시킬 수있는 방법이 있습니까? 지금까지 내가 아는 한, ViewState를 아직 사용할 수없는 OnInit에서 이런 일이 발생했습니다. ID를 ViewState에 저장하면 작동하지 않습니다.

제안 사항

+0

이 질문을 확인하십시오 : [.Net 요소 ID 변경] (http : // stackoverflow.com/questions/699677/-net-changes-the-element-ids/699691 # 699691) –

답변

5

INamingContainer을 구현하면 문제가 해결됩니다. 그런 다음 모든 단추의 이름을 계속 바꿀 수 있습니다 btnTest.

이것은 단지 마커 인터페이스이므로 메서드 나 속성을 구현할 필요가 없습니다. 이 마커 인터페이스입니다 아무 구현을 필요로하지

public class MyCustomControl : Panel, INamingContainer 
{ 
} 

: 상속하는 INamingContainer에서 같은

+0

감사합니다. 그 동안 내가 상속 한 Panel의 clientID를 추가하는 대신, 솔루션으로 다시 전환 할 것입니다. 감사 – Juri

0

. 방금 귀하의 코드를 확인하고 귀하의 문제를 해결합니다.

0

INamingContainer를 구현하면됩니다. 고유 한 ID로 자동으로 버튼의 이름을 지정합니다. 자바 메모에서 해당 단추를 사용해야하는 경우 ClientID 속성을 사용해야합니다.

function getButton() { 
    var myButton = document.getElementById('<%=btnTest.ClientID %>'); 
} 
관련 문제