2014-01-29 3 views
0

이상한 포스트 백 문제가 있습니다. 두 개의 드롭 다운, 프로젝트 및 청구 코드가 있습니다. 프로젝트 선택에 따라 요금 코드 드롭 다운이 채워집니다. 충전 코드를 선택하면 값이 초 단위로 드롭 다운에 표시되고 드롭 다운의 첫 번째 선택 항목으로 변경됩니다. 해당 드롭 다운의 인덱스 변경이 트리거되고 해당 값은 드롭 다운에서 선택한 첫 번째 옵션이 아닙니다. 왜 이렇게하는지 모르겠지만 다시 게시와 관련이 있어야합니다. 그것은 다시 게시 문제가 있다면, 거기에 드롭 다운 선택을 저장하고 다시로드 후 선택을 복원하는 방법은 무엇입니까? 허용되지 않으므로 AJAX를 사용하거나 패널을 업데이트하지 마십시오.계단식 드롭 다운 및 컨트롤 상태 (AJAX, Jquery 또는 업데이트 된 패널 없음)

<p> 
    <asp:DropDownList ID="ddlProjects" runat="server" 
     onselectedindexchanged="ddlProjects_SelectedIndexChanged" 
     AutoPostBack="True" Visible="false" > 
    </asp:DropDownList> 
</p> 
    <asp:DropDownList ID="ddlChargeCodes" runat="server" AutoPostBack="true" 
     onselectedindexchanged="ddlChargeCodes_SelectedIndexChanged" Visible="false"> 
    </asp:DropDownList> 
    <p> 

과 뒤에 C# 코드 :

 protected void Page_Load(object sender, EventArgs e) 
    { 
     try 
     { 

      if (!IsPostBack) 
      { 
       LoadProjectsDropDown(); 
      }  
     //Rest of Pageload Omitted.... 


     // Initial Population of Project Dropdown 
     protected void LoadProjectsDropDown() 
    { 
     try 
     { // Populate the Projects Drop Down from Table 
      ddlProjects.Items.Clear(); 
      ddlProjects.DataSource = Time_Tracker.BLL.ProjectsManager.GetItems(); 
      ddlProjects.DataTextField = "Project_Name"; 
      ddlProjects.DataValueField = "Project_ID"; 
      ddlProjects.DataBind(); 
      ddlProjects.Items.Insert(0, new ListItem("PLEASE SELECT A PROJECT", 
      "PLEASE SELECT A PROJECT")); 
     } 
     catch (Exception ex) 
     { 
      Utilities.ErrorLog(ex.Message, ex.GetType().ToString(), ex.StackTrace, 
     @"Time_Tracker.txt"); 
     } 
     } 



     // The Index Change portion of the Project Dropdown, which builds the Charge Code dropdown 
     protected void ddlProjects_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     try 
     { // When user selects the Project, Populate Charge Codes for the selected Project 
      ddlChargeCodes.Visible = true; 
      if (!string.IsNullOrEmpty(ddlProjects.SelectedValue)) 
      { 
       ddlChargeCodes.Items.Clear(); 
       ddlChargeCodes.DataSource = Time_Tracker.BLL.TasksManager.GetChargeCodes 
     (ddlProjects.SelectedValue); 
       ddlChargeCodes.DataTextField = "Description"; 
       ddlChargeCodes.DataValueField = "Project_ID"; 
       ddlChargeCodes.DataBind(); 
       ddlChargeCodes.Items.Insert(0, new ListItem("PLEASE SELECT A CHARGE 
     CODE", "PLEASE SELECT A CHARGE CODE")); 
       Utilities.Project = Convert.ToInt16(ddlProjects.SelectedValue); 
      } 
     } 
     catch (Exception ex) 
     { 
      Utilities.ErrorLog(ex.Message, ex.GetType().ToString(), ex.StackTrace, @"Time_Tracker.txt"); 
     } 
    } 


      // The Index Change of the Charge Codes Dropdown 
      protected void ddlChargeCodes_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     try 
     { // When user selects the Charge Code, it shows a summary and asks for the number of hours 
      Utilities.Description = Convert.ToString(ddlChargeCodes.SelectedItem); 
      Utilities.Chargecode = Convert.ToString(ddlChargeCodes.SelectedItem); 
      lblHoursLabel.Visible = true; 
      txtHours.Visible = true; 
      lblConfirmation.Visible = true; 
      btnStarOver.Visible = true; 
      btnOK.Visible = true; 
      lblConfirmation.Text = "Hours on " + Utilities.SelectedDate + " For Charge Code " + Utilities.Description; 
     } 
     catch (Exception ex) 
     { 
      Utilities.ErrorLog(ex.Message, ex.GetType().ToString(), ex.StackTrace, @"Time_Tracker.txt"); 
     } 
    } 

답변

0

오늘 문제 해결을 많이 했어요 여기 내 ASP 코드입니다. 충전 코드를 선택할 때 "change index"이벤트 핸들러를 트리거하지 않고 페이지로드를 수행한다는 것을 알게되었습니다. 페이지로드가 완료되면 첫 번째 선택 항목 (인덱스 1)이 선택된 인덱스 변경 이벤트가 트리거됩니다. 내가 말했던 모두는 그것이 그것이 일하는 방식으로 작동해야한다고 말했다. 마지막으로 저장 프로 시저를 사용하는 대신 드롭 다운을 채우기 위해 쿼리/데이터 바인딩 부분을 썼습니다. 이제는 작동합니다. 나는 사람들이 미래에 도움이된다면 코드 변경을 포함 시켰습니다.

  protected void ddlProjects_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     try 
     { // When user selects the Project, Populate Charge Codes for the selected Project 
      ddlChargeCodes.Visible = true; 
      if (!string.IsNullOrEmpty(ddlProjects.SelectedValue)) 
      {     
       ddlChargeCodes.Items.Clear(); 
       string strConn = Time_Tracker.DAL.DBUtils.SqlConnectionString; 
       SqlConnection con = new SqlConnection(strConn); 
       SqlCommand cmd = new SqlCommand(); 
       cmd.Connection = con; 
       cmd.CommandType = CommandType.Text; 
       cmd.CommandText = "SELECT Charge_Code, Charge_Code + ' - ' + Description AS Description FROM [Time_Tracker].[dbo].[Tasks] WHERE Inactive = 0 AND Project_ID = " + ddlProjects.SelectedValue; 
       DataSet objDs = new DataSet(); 
       SqlDataAdapter dAdapter = new SqlDataAdapter(); 
       dAdapter.SelectCommand = cmd; 
       con.Open(); 
       dAdapter.Fill(objDs); 
       con.Close(); 
       if (objDs.Tables[0].Rows.Count > 0) 
       { 
        ddlChargeCodes.DataSource = objDs.Tables[0]; 
        ddlChargeCodes.DataTextField = "Description"; 
        ddlChargeCodes.DataValueField = "Charge_Code"; 
        ddlChargeCodes.DataBind(); 
        ddlChargeCodes.Items.Insert(0, "PLEASE SELECT A CHARGE CODE"); 
       } 

       Utilities.Project = Convert.ToInt16(ddlProjects.SelectedValue); 
      } 
     } 
     catch (Exception ex) 
     { 
      Utilities.ErrorLog(ex.Message, ex.GetType().ToString(), ex.StackTrace, @"Time_Tracker.txt"); 
     } 
    }