2011-11-09 3 views
1

동료와 나는 다음 코드의 EventHandlers가 실행되지 않는 이유를 알 수 없습니다. 이 함수는 첫 번째 페이지가로드되기 전에 두 번 호출되며 AutoPostBack은 true로 설정됩니다. lnkbtn 버튼과 ddlDose DropDownList는 해고되지 않습니다. 다시 게시되지만 이벤트 핸들러는 호출하지 않습니다. 여기에 몇 가지 코드가 있습니다 ... 아무도 본질적으로 잘못된 것을 볼 수 있습니까?EventHandlers가 DropDownList 및 버튼에 대해 실행되지 않음

를 Page_Load :

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) 
    { 
    tblMedOrdering = (Table)Session["tblMedOrdering"]; 
    List<string>medNames = (List<string>)Session["medNamesList"]; 
    populateMeds(medNames); 
    } 
} 

PopulateMeds : 그것은 필요하지 않도록

protected void populateMeds(List<string> medNames) 
{ 
     if (medNames.Count == 0) 
     { 
      tblMedOrdering = (Table)Session["tblMedOrdering"]; 
     } 
     else 
     { 
      DataSet ds = new DataSet(); 
      string strConn = Application["dbconn"].ToString(); 
      using (SqlConnection dbconn = new SqlConnection(strConn)) 
      using (SqlCommand medDbcmd = dbconn.CreateCommand()) 
      { 
       dbconn.Open(); 

       for (int i = 0; i < medNames.Count; i++) 
       { 
        DropDownList ddlDose = new DropDownList(); 
        DropDownList ddlSig = new DropDownList(); 

        int flag = 0; 

        if ((Table)Session["tblMedOrdering"] != null) 
        { 
         for (int j = 0; j < tblMedOrdering.Rows.Count; j++) 
         { 
          if (tblMedOrdering.Rows[j].Cells[3].Text == medNames[i].ToString()) 
          { 
           flag = 1; 
           ddlSig = (DropDownList)tblMedOrdering.Rows[i].Cells[2].FindControl(medNames[i].ToString() + "ddlSig"); 
           if (ddlSig == null) 
           { 
            ddlSig.ID = medNames[i].ToString() + "ddlSig"; 
            ListItem liDefaultSig = new ListItem(); 
            liDefaultSig.Value = "0"; 
            liDefaultSig.Text = "Select . . ."; 
            ddlSig.Items.Add(liDefaultSig); 
           } 
           break; 
          } 
         } 
        } 

        if (flag != 1) 
        { 
         ListItem liDefault = new ListItem(); 
         liDefault.Value = "0"; 
         liDefault.Text = "Select . . ."; 

         ddlDose.Items.Add(liDefault); 
         ddlSig.Items.Add(liDefault); 

         ddlDose.ID = medNames[i].ToString() + "ddlDose"; 
         ddlSig.ID = medNames[i].ToString() + "ddlSig"; 

         ddlDose.AutoPostBack = true; 

         ddlDose.TextChanged += new EventHandler(ddlDose_SelectedIndexChanged); 

         medDbcmd.CommandText = "Select distinct medorderid, dose from ordertablemeds where medordername = '" + medNames[i].ToString() + "'"; 

         SqlDataReader dr = medDbcmd.ExecuteReader(); 

         if (dr != null) 
         { 
          while (dr.Read()) 
          { 
           ListItem liDose = new ListItem(); 

           liDose.Value = dr["medorderid"].ToString(); 
           liDose.Text = dr["dose"].ToString(); 

           ddlDose.Items.Add(liDose); 
          } 
          dr.Close(); 
         } 

         TableRow tr = new TableRow(); 
         tr.ID = medNames[i].ToString() + "TableRow"; 

         TableCell tcDose = new TableCell(); 
         TableCell tcSig = new TableCell(); 
         TableCell tcRemove = new TableCell(); 
         TableCell tcMedName = new TableCell(); 


         tcDose.Controls.Add(ddlDose); 

         tcSig.Controls.Add(ddlSig); 
         tcMedName.Text = medNames[i].ToString(); 
         tcMedName.ID = medNames[i].ToString() + "medname"; 

         LinkButton lnkbtn = new LinkButton(); 
         lnkbtn.Text = "X"; 
         lnkbtn.ForeColor = System.Drawing.Color.Red; 
         lnkbtn.ID = medNames[i].ToString() + "_lnkbtn" + tblMedOrdering.Rows.Count; 
         lnkbtn.Click += new EventHandler(Reset_Click); 

         tcRemove.Controls.Add(lnkbtn); 

         tr.Cells.Add(tcRemove); 
         tr.Cells.Add(tcDose); 
         tr.Cells.Add(tcSig); 
         tr.Cells.Add(tcMedName); 

         tblMedOrdering.Rows.Add(tr); 

        } 
       } 
       tblMedOrdering.DataBind(); 
       dbconn.Close(); 
      } 
     } 

     Session["tblMedOrdering"] = tblMedOrdering; 

     if (medNames.Count == 0) 
     { 
      cpeMeds.Collapsed = true; 
      cpeMeds.ClientState = "True"; 
     } 

     List<string> medNamesList = new List<string>(); 
     DropDownList ddl = new DropDownList(); 
     for (int k = 0; k < tblMedOrdering.Rows.Count; k++) 
     { 
      ddl = (DropDownList)tblMedOrdering.Rows[k].Cells[1].FindControl(tblMedOrdering.Rows[k].Cells[3].Text +"ddlDose"); 
      ddl.SelectedIndexChanged += new EventHandler(ddlDose_SelectedIndexChanged); 
      medNamesList.Add(tblMedOrdering.Rows[k].Cells[3].Text); 
     } 
     Session["medNamesList"] = medNamesList; 
    } 

PopulateMeds, 그냥 숨김 코드에서 호출되는 문자열 이름의 목록을 제공하는 기능입니다 args는 마치 컨트롤 (개체 보낸 사람, EventArgs e) 인 것처럼 보입니다.

+4

Page_Load() 대신 OnInit()에서 컨트롤을 바인딩 해보십시오. 또한 ASP.NET 페이지 수명주기 - http://msdn.microsoft.com/ko-kr/library/ms178472.aspx를 참조하십시오. – jrummell

+1

이것은 완전히 중복되는 질문이 아니기 때문에 투표 마감을하지 않겠지 만 첨부 된 질문에 대한 내 대답의 기사가 통찰력을 제공 할 수 있습니다. 추가하는 컨트롤이 ViewState에 추가 될만큼 빨리 추가되지 않습니다 (따라서 이벤트가 실제로 유선 상태가 아닙니다) ... http://stackoverflow.com/questions/8050652/how-do- 프로그램 적으로 할당 된 클릭 이벤트 - 총알 목록 -pro-was-pro/8050691 # 8050691 –

+0

@Joel 분명히 그 링크에 관심이 있습니다. 게시하기 전에 관련 추천 링크를 많이 보았지만 그 중 하나가 아니었고 아무도 실제로 관련성이 없었습니다. – rownage

답변

2

로직을 OnInit으로 옮기고 이벤트 핸들러가 제대로 작동한다고 가정합니다. 나는 또한 당신이 유효성 검사를 가지고 있지 않은지 확인하여 다시 게시를 방해하고있다.

관련 문제