2014-09-28 3 views
-1

나는 두 개의 체크 박스 목록 인 CandidateName과 Payment와 dropdownlist를 가지고있다. 사용자는 체크 박스 목록에서 여러 항목을 선택하고 드롭 다운 목록에서 하나를 선택할 수 있습니다. chechboxlists 및 dropdownlist의 해당 데이터를 Panel에 배치합니다. 여기에 gridview가있는 UpdatePanel이 있습니다. Add Button을 클릭하여 Panel을 열면 모든 데이터가 제대로 채워집니다. 디버그시 "for 루프"를 통해 여러 개의 선택된 체크 박스 목록을 저장하려고하면 체크 된 데이터가 쉼표로 누적되어 루프에 저장되지 않고 데이터베이스에 저장됩니다. 대신, "if (cblPayment1.Items [j] .Selected == true)"를 실행 한 후 다른 쿼리 문으로 건너 뜁니다. 도와주세요.선택한 여러 체크 박스 목록을 데이터베이스 asp.net에 저장하는 방법 C#

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

     string strcbl1 = string.Empty; 
     string strcbl2 = string.Empty; 
     compCon = new SqlConnection(strConnectionString); 
     compCon.Open(); 


     for (int i = 0; i < cblCandidateName1.Items.Count-1; i++) 
     { 
      if (cblCandidateName1.Items[i].Selected ==true) 
      { 
       strcbl1 = strcbl1 + cblCandidateName1.Items[i].Value.ToString() + ","; 
      } 
     } 

     for (int j = 0; j < cblPayment1.Items.Count - 1; j++) 
     { 
      if (cblPayment1.Items[j].Selected == true) 
      { 
       strcbl2 += cblPayment1.Items[j].Value.ToString() + ","; 
      } 
     } 


     string InsertSchedule = "INSERT INTO ScheduleEmail(CANDIDATE_ID, PAYMENT_ID,  TEMPLATE_ID)VALUES(@strCID, @strPID, @strCourseID)"; 
     SqlCommand InsertScheduleCommand = new SqlCommand(InsertSchedule, compCon); 
     InsertScheduleCommand.Connection = compCon; 


     InsertScheduleCommand.Parameters.AddWithValue(@"strCID", strcbl1); 
     InsertScheduleCommand.Parameters.AddWithValue(@"strPID", strcbl2); 
     InsertScheduleCommand.Parameters.AddWithValue(@"strCourseID", strCourseID); 

     InsertScheduleCommand.ExecuteNonQuery(); 
     compCon.Close(); 
    } 
    catch (Exception ex) 
    { 
     ShowPopUpMsg("Data is failed to save in table. Please contact your system administrator \n" + ex.ToString()); 
    } 
    finally 
    { 
    DispalyGridViewScheduleEmail(); 

    compCon.Close(); 
    } 

} 

이것은 제 HTML 코드입니다. 당신의 for 블록의

<!--Panel to add new record--><asp:Panel ID="panelAddNew" runat="server" 
style="display:none; background-color:gray;"  ForeColor="Black" Width="500" Height="550"> 
<asp:Panel ID="panelAddNewTitle" runat="server" 
style="cursor:move;font-family:Tahoma;      
padding:2px;" HorizontalAlign="Center" BackColor="Blue" ForeColor="White" Height="25"> 
<b>Add New</b></asp:Panel> 
<table width="100%" style="padding:5px"> 
      <tr> 
      <td colspan="3"> 
       <asp:Label ID="lblStatus1" runat="server"></asp:Label> 
      </td> 
      </tr> 
      <tr> 
       <td><b>Select Candidate Name(s)</b></td> 
       <td><b>:</b></td> 
       <td><asp:CheckBoxList ID="cblCandidateName1" runat="server" RepeatColumns="3" RepeatDirection="Horizontal" RepeatLayout="table"> 
       </asp:CheckBoxList> 
       </td> 
      </tr> 
      <tr> 
       <td><b>Select Payments</b></td> 
       <td><b>:</b></td> 
       <td> 
        <asp:CheckBoxList ID="cblPayment1" runat="server" RepeatDirection="Horizontal" RepeatLayout="Table"></asp:CheckBoxList> 
       </td> 
      </tr> 


      <tr> 
       <td><b>Course Name</b></td> 
       <td><b>:</b></td> 
       <td> <asp:DropDownList ID="ddlCourseName" runat="server">  </asp:DropDownList>    


       </td> 
      </tr> 
     </table> 
     <br /> 
      <div align="center"> 
      <asp:Button ID="btnAddNew2" runat="server" Width="70" Text="Add" OnClick="btnAddNew_Click" ValidationGroup="add"/> 
      &nbsp; 

      <asp:Button ID="btnCancel1" runat="server" Width="70" Text="Cancel" CausesValidation="false" OnClick="Cancel_Click" ValidationGroup="add"/> 
     </div> 
    </asp:Panel> 
     <!--End of Panel to add new record--> 

답변

1

모두 있기 때문에이 조건의 cblCandidateName1.Items의 마지막 항목에서 실행하고 cblPayment1.Items되지 않습니다 :

for (int i = 0; i < cblCandidateName1.Items.Count-1; i++) 

for (int j = 0; j < cblPayment1.Items.Count - 1; j++) 

당신은 모두를 변경해야 귀하의 for님께 서 다음 주소로 가려면

(210)
for (int i = 0; i < cblCandidateName1.Items.Count; i++) 
{ 
    if (cblCandidateName1.Items[i].Selected ==true) 
    { 
     strcbl1 = strcbl1 + cblCandidateName1.Items[i].Value.ToString() + ","; 
    } 
} 

for (int j = 0; j < cblPayment1.Items.Count; j++) 
{ 
    if (cblPayment1.Items[j].Selected == true) 
    { 
     strcbl2 += cblPayment1.Items[j].Value.ToString() + ","; 
    } 
} 

UPDATE

cblPayment1.Items[j].Selected 당신이 지불 checkboxlist의 일부를 확인하더라도 항상 false 것 같다. 가능한 원인은 저장 버튼을 클릭하면이 Page_Load 방법 cblPayment1 항목이 아닌 내부 if (!this.IsPostBack) 블록

protected void Page_Load(object sender, EventArgs e) 
{ 
    cblPayment1.DataSource = .... ; 
    cblPayment1.DataBind(); 
} 

을 채우는 일 수 있었다, Page_Load 방법은 첫째 btnAddNew_Click 전에, 그래서 cblPayment1가 다시 채워됩니다 실행되고 모든 것 그 btnAddNew_Click 방법에 도달하면 항목이 선택되지 않습니다. 당신은 당신이 질문에 표시하는 방식으로 루프에서 문자열 연결을 사용하지하려고 모두 다음과 같은

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!this.IsPostBack) 
    { 
     cblPayment1.DataSource = .... ; 
     cblPayment1.DataBind(); 
    } 
} 
+0

빼기 1을 제거하고 디버깅했습니다. 그것은 여전히 ​​"if"문 안에 들어 가지 않습니다. 도와 줘서 고마워. – jkhaung

+0

'cblPayment1.Items [j] .Selected'가 실제로 true인지 확인 했습니까? – ekad

+0

사실입니다. 체크 박스 목록 2 개를 선택했습니다. – jkhaung

0

첫째로 Page_Load 코드를 변경해야합니다. 모든 연결이 문자열에 대해 새 메모리를 다시 할당 한 다음 그 위치에 복사하기 때문에 나중에는 성능 문제가 발생합니다.

그리고이 코드에서 일부 람다를 사용하는 것이 어떻습니까? 다음과 같이 극적으로 단순화됩니다.

strcbl1=string.Join(",", cblCandidateName1.Items.Where(x=>x.Selected)); 
strcbl2=string.Join(",", cblPayment1.Items.Where(x=>x.Selected));