2010-11-20 3 views
-1

우선, 내 질문에 중복이있을 수는 있지만 죄송합니다. 너무 많이 검색하면 솔루션을 찾을 수 없습니다. Scenerio는 UserControl입니다. 지정된 목록의 개수가 0보다 많으면이 사용자 정의 컨트롤이 동적으로 ListBox를 만듭니다. 컨트롤이 동적으로 추가되고 추가하는 데 문제가 없지만 이벤트 처리기가 추가되지 않습니다. 첫 번째 listBox에서 항목을 선택하면 secondListBox가 동적으로 추가되고 항목도 동적으로 추가됩니다. 첫 번째 listBox가 나타나지만 selectedIndexChanged 이벤트 핸들러가 작동하지 않습니다. 내 코드의 문제점은 무엇입니까?동적으로 추가 된 ListBox의 EventHandler가 ASP.Net에서 실행되지 않습니다

편집 : 나는

li.Attributes.Add("onselectedindexchanged","selectedIndexChanged"); 

또는

li.AutoPostBack = true; 

하지만 여전히 발사하지

...

private List<string> myList = new List<string>() { "Serkan", "Kadir" }; 
    private List<string> mySecondList = new List<string>() { "Istanbul", "Ankara" }; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      if (myList.Count > 0) 
      { 
       ListBox li = new ListBox(); 
       li.ID = Guid.NewGuid().ToString(); 
       li.SelectedIndexChanged += new EventHandler(this.selectedIndexChanged); 
       foreach (string item in myList) 
       { 
        li.Items.Add(item); 
       } 

       this.Controls.Add(li); 
      } 
     } 
    } 

    private void selectedIndexChanged(object sender, EventArgs e) 
    { 
     ListBox li2 = new ListBox(); 
     li2.ID = Guid.NewGuid().ToString(); 

     foreach (string item in mySecondList) 
     { 
      li2.Items.Add(item); 
     } 
     this.Controls.Add(li2); 
    } 

답변

0

여러분, 제 코드가 잘 작동합니다. 방금 diff 스튜디오에서이 작업을 시도했지만 모든 것이 정상적으로 작동했습니다. @ RichardW1001 및 @Microgen은 관심과 게시물에 감사드립니다.

0
li.Attributes.Add("onselectedindexchanged","selectedIndexChanged"); 

는 클라이언트 측 HTML을 추가를 추가하려고 속성. 여기에 표시된 selectedIndexChanged 메서드는 서버 측 메서드입니다. 컨트롤에 자동 포스트 백을 추가하거나 컨트롤에 서버 측 이벤트 처리기를 추가하여 서버에서 C# 함수를 호출하거나 클라이언트 측 JavaScript 함수를 사용하여 클라이언트 측 처리 행사.

편집 ---

는 페이지가 서버에 다시 게시하면, 제어가 존재 중단. Page는 새로운 isntance이며 컨트롤 모음에 추가 된 목록 상자가 없습니다. 자동 포스트 백이 true이지만 컨트롤이 서버의 Page 개체에 없으면 If가 호출되고 If Page.IsPostBack 블록을 제거하면 컨트롤이 다시 만들어져 컨트롤이 그 사건이 제기 된 사람, 그리고 그 통제는 여전히 존재하지 않는다.

이 컨트롤의 실제 목표는 무엇입니까? 마스터 세부 정보를 제공하는 것입니까?

편집 2 ---

작동 당신을 위해

만든 솔루션 :

페이지 :

<asp:ListBox ID="ListBox1" runat="server" AutoPostBack="true" Visible="false" OnSelectedIndexChanged="ListBox1_SelectedIndexChanged"></asp:ListBox> 
<br /> 
<asp:ListBox ID="ListBox2" runat="server" Visible="false"></asp:ListBox> 

Codebehind가 : 당신의 이벤트가

private List<string> myList = new List<string> { 
    "Serkan", 
    "Kadir" 
}; 
private List<string> mySecondList = new List<string> { 
    "Istanbul", 
    "Ankara" 

}; 
protected void Page_Load(object sender, System.EventArgs e) 
{ 
    if (!Page.IsPostBack) { 
     if (myList.Count > 0) { 
      ListBox1.DataSource = myList; 
      ListBox1.DataBind(); 
      ListBox1.Visible = true; 
     } 
    } 
} 

protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    ListBox2.DataSource = mySecondList; 
    ListBox2.DataBind(); 

    ListBox2.Visible = true; 
} 
+0

당신은 모든 것을 놓치고 있습니다. 이러한 컨트롤은 수동으로 추가됩니다. 제 질문을주의 깊게 읽으십시오. 컨트롤이 동적으로 추가됩니다 (N 번호 목록 상자가 있음을 의미 함). 이벤트 처리기도 추가됩니다. 수동으로 추가하고 가시성을 변경합니다. 미안 해요,하지만 이건 내 질문의 대답이 아니에요. –

+0

죄송합니다. 내가 만들고자하는 것은 Controls 컬렉션이 Page의 특정 인스턴스에 속해 있다는 것입니다. 서버에서 페이지를 요청할 때마다 새로운 인스턴스가 생성됩니다. 즉, 더 이상 존재하지 않는 이전에 생성 된 페이지 인스턴스에 추가 한 컨트롤에 대해 아무것도 알지 못합니다. – RichardW1001

+0

ASP.net은 HTML을 생성하고 HTML은 "가시성"을 갖지 않습니다. 그 방법을 제안한 이유는 귀하의 방법과 정확히 동일한 HTML 마크 업을 생성하지만 포스트 백에서 작동한다는 것입니다. visible = false는 ASP.net이 HTML을 렌더링하지 않도록 지시합니다. 중요한 차이점은 컨트롤이 Page/UserControl의 모든 인스턴스에 등록되므로 이벤트 등에서 사용할 수 있다는 점입니다. 추가하는 컨트롤은 이전 인스턴스에 존재하기 때문에 포스트 백에서 작동하지 않습니다. 더 이상 존재하지 않다. BTW 원래 질문에 수준의 변수 번호를 언급하지 않습니다. – RichardW1001

0

이유를 발생하지 않습니다 ASP.Net 페이지 수명주기를 오해하고 있기 때문입니다. 페이지를 요청하면 ASP.Net은 해당 페이지 클래스의 새 인스턴스를 만듭니다. 이 인스턴스는 과거에 생성 된 다른 인스턴스에 대해서는 아무것도 모릅니다. Page 클래스의 인스턴스를 사용하여 HTML 묶음을 생성하고,이를 브라우저로 응답으로 보냅니다. 그런 다음 서버의 Page 클래스 인스턴스가 상태와 함께 파괴됩니다.

페이지가 다시 게시되면 ASP.Net은 viewstate, ids 등을 사용하여 읽은 다음 새로 게시 된 페이지 인스턴스의 서버 컨트롤에 다시 게시 된 HTML 요소를 매핑합니다. 이전 인스턴스의 Controls 컬렉션에 추가 한 요소가이 새 인스턴스에 없으므로 ASP.Net에서 해당 인스턴스를 인식하거나 이벤트를 시작할 수 없습니다.

여기 GridViews를 사용하여 달성하려고 노력하고 있다고 생각되는 종류의 것을 보여주는 기사가 있으며 이전에 게시 한 솔루션과 비슷한 방식을 사용합니다. 더 나은 솔루션이있을 수 있기 때문에

http://www.codeproject.com/KB/aspnet/MultiNestMDGridview.aspx

은 아마 당신은, 최종 목표는 무엇인지 정확히 설명 할 수 있을까? 이전에 게시 한 접근 방식과 해당 링크의 솔루션 모두의 제한 사항은 사용할 수있는 세부 수준의 한정된 수의 숫자가 있으며 실제로 수행하려고 시도하는 것에 따라 문제 일 수도 있고 아닐 수도 있습니다. .

Edit--

당신이 @Microgen이 시사하는대로 후 Page_Init 이벤트로 변경하는 경우는 true (! Page.IsPostBack)로 설정 한 경우에는 AutoPostBack = 제거하고 동적으로 추가 제어를위한 비 휘발성 ID를 사용 , 이것은 서버 측 이벤트를 호출하고 두 번째 목록 상자를 렌더링합니다. Guid.New()에서는 새로 생성 된 Page의 Controls 컬렉션에 ID가 일치하는 항목이 포함되지 않으므로 이벤트 처리기가 연결되지 않기 때문에 작동하지 않습니다. 이것은 원래 게시 된 질문에 대답 할 것입니다. 그러나 두 번째 목록 상자는 이벤트를 생성하고 같은 방식으로 Page_Init의 Page.Controls에 추가하고 세 번째 등등의 경우 위에서 설명한 이유로 인해 이벤트를 추가하지 않는 한 이벤트를 발생시키지 않습니다.

0

동적 추가 컨트롤은 page_load가 아닌 page_init 이벤트에로드해야합니다. 확인란이 asp.net 컨트롤하지만 html로 일반 입력으로 렌더링

+0

체크 박스 목록을 사용하고 있지 않습니다. ListBox를 사용하고 있습니다. –

+0

어떤 ASP.net 컨트롤, ListBox, CheckBoxList, 무엇이든간에, @Microgen과 자신이 작성한 포인트가 ASP.net 컨트롤이 아닌지 여부는 중요하지 않습니다. 클라이언트에 존재합니다. ASP.net은 컨트롤을 추상화로 사용하여 HTML을 생성합니다. 컨트롤은 브라우저에 존재하지 않습니다. – RichardW1001

관련 문제