2013-08-02 2 views
1

내가 좋아하는 것이 무엇 :추가 ASP 컨트롤을 프로그래밍 컨텐츠를 추가하는 방법

을 내가 oncommandcommandargument 속성을 가진 앵커를 만들 수있을 것입니다 이상적인 시나리오에서,하지만 작동하지 않는 틀리지 않는 경우 단추와 같은 컨트롤을 만들어야합니다. 내 문제는 컨트롤을 추가 할 무언가가 필요하기 때문에 페이지의 각 항목에 해당 버튼을 배치하고자 할 때 발생합니다. 그러나 runat="server"으로 앵커를 만들고 id="try"라고 말하면 나는 할 수 없습니다. try.Controls.Add(button) 앵커 'try'는 실제로 아직 만들어지지 않았습니다.

배경 :

대부분의 콘텐츠가 프로그래밍 방식으로 추가됩니다. stringbuilder는 페이지에 html로 표시 될 문자열을 만드는 데 사용됩니다. 이 문자열 중간에 페이지에 컨트롤을 추가 할 수 있습니까? 또는이 방식으로 프로그래밍 방식으로 추가되는 요소에?

나는 시도했다 : 요소가 프로그램 추가되기 때문에

는, 앵커 만들기 (또는 기타)와 그 요소의 id을 목표로하고 다음과 같이 버튼을 생성하지만,는 id 달라집니다 필요한 숫자 S는 try0, try1 등이 될 것입니다 :

var button = new Button { 
    CommandArgument = "test", 
    Text = "Try" 
}; 
button.Command += bt_sendMail_tryDevice_Click; 
try.Controls.Add(button); 

그래서 내 aspx 페이지에서 내가 불평하지 않습니다 그래서 id="try"와 '더미'요소가 다음의 변화를 시도했지만 이해 내가 그것을 어떻게 좋아하지 않는지, 동시에 나는 어떻게 알지 못한다. 주위를 둘러 볼 수 있습니다. (tryCount는 id를 고유하게 유지하기 위해 반복 할 때마다 증가하는 int입니다.)

this.FindControl(try.ToString() + tryCount.ToString()).Controls.Add(button); 
+0

'ASP : PlaceHolder'이 사용 사례를 위해 설계되었습니다. 컨트롤이 추가 될 때까지 (일반적으로 프로그래밍 방식으로) 렌더링되지 않습니다. –

+0

하지만 프로그래밍 방식으로 자리 표시자를 추가 할 수 없습니까? 고정 된 위치에서 다른 위치에 자리 표시자를 사용하고 있지만 여기에는 페이지의 각 행마다 다른 자리 표시자가 필요합니다. – dudledok

+0

"페이지의 각 행"은 무엇을 의미합니까? 격자보기 있어요? 연발총? 아이템 템플릿에 LinkButton을 추가 할 수 있습니까? – Jay

답변

0

귀하의 의견을 말하기가 다소 어렵지만 가능한 한 가까이 가려고 최선을 다할 것입니다. 첫 번째로 "컨테이너"로 작동 할 수있는 컨트롤이 필요합니다. 이것은 당신이 좋아하는 모든 컨트롤 일 수 있습니다.

<div runat="server" id="ContainerDiv"></div> 

다음 일은 당신이 당신의 아이디를 관리 할 수있는 방법이 필요하다 :이 시나리오에 대한 내 테스트에서 나는 이런 일을했다. 그래서 같은 간단한 변수 및 방법을 만들어 이런 짓을 :

private int IdCount = 0; 
private string GetNewID() 
{ 
    return string.Format("try{0}", IdCount++); 
} 

지금 당신은 당신이 또한 LinkButton이 작업을 수행하는 CommandNameCommandArgument이있는 achor 태그를 싶은 말은. 이 같은 위의 DIV에 LinkButton를 추가 할 수 있습니다
ContainerDiv.Controls.Add(
    new LinkButton() 
    { 
     ID = GetNewID(), 
     CommandName = "DoSomething", 
     CommandArgument = "arg", 
     Text= "Try Me", 
    }); 

분명히 대체 CommandName 그리고 당신이 정말로 원하는 값으로 나머지. ID가 항상 고유하게 할당되도록 GetNewID()으로 전화하십시오.

컨트롤은 페이지 자체를 포함하여 기존 서버 컨트롤의 자식으로 아무 곳에서나 추가 할 수 있지만 너무 복잡 할 수 있습니다. 포스트 백 이벤트가 올바르게 작동하지 않을 수 있으므로 가능한 한 빨리 페이지에 추가하십시오 (페이지 라이프 사이클에서).

업데이트

유지 참조는 이미 구현을 단순화 할 수있다 페이지에 요소를 생성합니다 :

public partial class _Default : Page 
{ 
    Control containerDiv; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     this.containerDiv = SomeMethodThatCreatesADiv(); 
     this.Page.Controls.Add(containerDiv); 
    } 

    void SomeOtherMethod() 
    { 
     this.containerDiv.Controls.Add(
      new LinkButton() 
      { 
       ID = GetNewID(), 
       CommandName = "DoSomething", 
       CommandArgument = "arg", 
       Text= "Try Me", 
      }); 
    }  
} 
+0

이것은 본질적으로 정확히 내가 해왔지만, 문제는 프로그래밍 방식으로 만들어진 ID 요소를 대상으로 할 수 없다는 것입니다. 예를 들어, div가 코드 뒤에서 만들어지기를 원하는 곳에서 div를 작성할 수 있습니다. 해당 div의 ID를 대상으로 지정하지 않습니다 (기술적으로 대상이 지정되기 전에도 intellisense는이를 알지 못합니다). – dudledok

+0

ID로 조회하는 대신 해당 div에 대한 참조를 유지하십시오. 내 대답을 업데이트 할게 – Jay

+0

실제로 여기서 무슨 일이 일어나고있는거야? – dudledok

관련 문제