2013-06-16 4 views
0

나는 3 개의 드롭 다운 목록을 가지고 있으며 목록에 선택된 값에 따라 이에 따라 동적 컨트롤을 만듭니다. 모든 것이 제대로 표시되지만 동적으로 생성 된 버튼을 클릭하면 이벤트가 실행되지 않습니다. DDL의 값이 필요하기 때문에 Page_LoadComplete를 사용하여 동적 컨트롤을 만듭니다. 이것이 내 버튼 이벤트가 실행되지 않는 이유입니까?Page_LoadComplete에서 동적 컨트롤 만들기

 protected void Page_LoadComplete(object sender, EventArgs e) 
    { 
     queries = new clsFormQueries(); 

     if (HttpContext.Current.User.IsInRole("Admin")) 
     { 
      if (!Page.IsPostBack) 
      { 
       List<Sport> sports = ComboBoxOptions.getSports(); 
       DropDownList temp = (DropDownList)loginView2.FindControl("Sport"); 
       temp.DataSource = sports; 
       temp.DataTextField = "Name"; 
       temp.DataValueField = "id"; 
       temp.DataBind(); 

       DropDownList teamsDD = (DropDownList)loginView2.FindControl("Team"); 

       List<Team> teamsList = ComboBoxOptions.getTeamsBySportId(Convert.ToInt32(temp.SelectedValue)); 
       teamsDD.DataSource = teamsList; 
       teamsDD.DataTextField = "fullName"; 
       teamsDD.DataValueField = "teamId"; 
       teamsDD.DataBind(); 

       DropDownList existingPlayers = (DropDownList)loginView2.FindControl("ExistingPlayers"); 

       List<Player> players = ComboBoxOptions.getPlayersBySport(Convert.ToInt32(temp.SelectedValue), Convert.ToInt32(teamsDD.SelectedValue)); 
       existingPlayers.DataSource = players; 
       existingPlayers.DataTextField = "fullName"; 
       existingPlayers.DataValueField = "playerid"; 
       existingPlayers.DataBind(); 


       //if (existingPlayers.SelectedValue != "" && temp.SelectedValue != "") 
       //{ 

       // DataTable updates = queries.GetPlayerUpdate(Convert.ToInt32(existingPlayers.SelectedValue), Convert.ToInt32(temp.SelectedValue)); 
       // if (updates.Rows.Count > 0) 
       //  CreateUpdatesHTML(updates); 
       //} 

      } 

      DropDownList temp2 = (DropDownList)loginView2.FindControl("Sport"); 
      DropDownList existingPlayers2 = (DropDownList)loginView2.FindControl("ExistingPlayers"); 
      if (existingPlayers2.SelectedValue != "" && temp2.SelectedValue != "") 
      { 

       DataTable updates = queries.GetPlayerUpdate(Convert.ToInt32(existingPlayers2.SelectedValue), Convert.ToInt32(temp2.SelectedValue)); 
       if (updates.Rows.Count > 0) 
        CreateUpdatesHTML(updates); 
      } 

     } 



    } 


private void CreateUpdatesHTML(DataTable updates) 
    { 

     foreach (DataRow update in updates.Rows) 
     { 
      int playerUpdateId = (int)update["playerUpdateId"]; 
      string updateText = update["PlayerUpdate"].ToString(); 

      TextBox tb = new TextBox(); 
      tb.ID = "UpdateText" + playerUpdateId; 
      tb.TextMode = TextBoxMode.MultiLine; 
      tb.Rows = 5; 
      tb.Text = updateText; 
      tb.CssClass = "span5"; 

      Button btnDelete = new Button(); 
      btnDelete.Click += new EventHandler(btnDelete_Click); 
      btnDelete.ID = "Delete"+playerUpdateId.ToString(); 
      btnDelete.Text = "Delete"; 
      btnDelete.CssClass = "btn btn-info"; 

      Button btnUpdate = new Button(); 
      btnUpdate.Click += new EventHandler(btnUpdate_Click); 
      btnUpdate.ID = "Update"+playerUpdateId.ToString(); 
      btnUpdate.Text = "Update"; 
      btnUpdate.CssClass = "btn btn-info"; 

      HtmlGenericControl div2 = new HtmlGenericControl("div"); 
      div2.Attributes.Add("class", "pull-right span5"); 

      div2.Controls.Add(btnDelete); 
      div2.Controls.Add(btnUpdate); 

      HtmlGenericControl hr = new HtmlGenericControl("hr"); 
      HtmlGenericControl br = new HtmlGenericControl("br");   
      existingUpdates.Controls.Add(tb); 
      existingUpdates.Controls.Add(div2); 
      existingUpdates.Controls.Add(br); 
      existingUpdates.Controls.Add(hr); 

     } 
    } 

답변

0

내 생각 엔 당신이 내부의 당신의 Page_LoadComplete 이벤트에 대한 논리를 포장했기 때문에 버튼의 클릭이 포스트 백을 발생하기 때문에 (! Page.IsPostBack), 당신의 동적으로 생성 된 컨트롤이 제대로 재현되지 않은 경우이다 (읽기 : 클릭 이벤트 처리가 없습니다). Page_LoadComplete (비 포스트 백 또는 포스트 백)를 호출 할 때마다 동적 컨트롤을 다시 만들고 이벤트를 연결하는 논리가 필요합니다.

+0

자세히 보시면 컨트롤을 만드는 로직이 포스트 백 내부에 있지 않습니다. – bewilderedprogrammer

+0

죄송합니다. 내 잘못입니다. Page_LoadComplete 이벤트 내에서 CreateUpdatesHTML 함수 호출에 중단 점을 넣고 포스트 백에서 실행 중인지 확인 했습니까? –