2015-06-21 137 views
0

我不知道哪里出了问题。 我想通过gridview中的复选框选项来选择哪个用户发送电子邮件,但是当我按下发送后,错误告诉我索引超出范围。ASP.NET C#:发生错误:索引超出范围。必须是非负数且小于集合的大小。参数名称:index(GRIDVIEW)

HTML标记:

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
    AllowSorting="True" AutoGenerateColumns="False" CellPadding="4" 
    DataSourceID="SqlDataSource1" ForeColor="#333333" GridLines="None"> 
     <AlternatingRowStyle BackColor="White" /> 
     <Columns> 
      <asp:BoundField DataField="username" HeaderText="username" SortExpression="username" /> 
      <asp:BoundField DataField="email" HeaderText="email" SortExpression="email" /> 

     <asp:TemplateField HeaderText="CheckAll"> 
       <HeaderTemplate> 
        <asp:CheckBox ID="chkSelectAll" runat="server" 
            AutoPostBack="true" 
            OnCheckedChanged="chkSelectAll_CheckedChanged"/>Send Mail To All ? 
       </HeaderTemplate> 
        <ItemTemplate> 
        <asp:CheckBox ID="chkSelect" runat="server"/> 
        </ItemTemplate> 
       </asp:TemplateField> 


      <asp:BoundField DataField="gender" HeaderText="gender" SortExpression="gender" /> 
      <asp:BoundField DataField="dateOfBirth" HeaderText="dateOfBirth" SortExpression="dateOfBirth" /> 
      <asp:BoundField DataField="contactNo" HeaderText="contactNo" SortExpression="contactNo" /> 
     </Columns> 
     <EditRowStyle BackColor="#2461BF" /> 
     <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> 
     <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> 
     <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /> 
     <RowStyle BackColor="#EFF3FB" /> 
     <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /> 
     <SortedAscendingCellStyle BackColor="#F5F7FB" /> 
     <SortedAscendingHeaderStyle BackColor="#6D95E1" /> 
     <SortedDescendingCellStyle BackColor="#E9EBEF" /> 
     <SortedDescendingHeaderStyle BackColor="#4870BE" /> 
    </asp:GridView> 
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:EBizProjectConnection %>" SelectCommand="SELECT [username], [email], [gender], [dateOfBirth], [contactNo] FROM [Users] WHERE (([newsletter] = @newsletter) AND ([accountType] = @accountType))"> 
     <SelectParameters> 
      <asp:Parameter DefaultValue="yes" Name="newsletter" Type="String" /> 
      <asp:Parameter DefaultValue="user" Name="accountType" Type="String" /> 
     </SelectParameters> 
    </asp:SqlDataSource> 

C#代码隐藏:

public partial class Pages_StaffSendingNewsletter : System.Web.UI.Page 
{ 
    protected void btnSend_Click(object sender, EventArgs e) 
    { 
     SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ProjectConnection"].ConnectionString); 

    protected void Page_Load(object sender, EventArgs e) 
    { } 
     string UserID = string.Empty; 
     DataTable dt = new DataTable(); 
     try 
     { 
      foreach (GridViewRow row in GridView1.Rows) 
      { 
       CheckBox cb = (CheckBox)row.FindControl("chkSelect"); 

       if (cb.Checked == true) 
       { 
        if (cb != null && cb.Checked) 
        { 
         UserID = Convert.ToString(GridView1.DataKeys[row.RowIndex].Value); 
         SqlCommand cmd = new SqlCommand("select email from Users where UserID=" + UserID + "", conn); 
         SqlDataAdapter adp = new SqlDataAdapter(cmd); 

         adp.Fill(dt); 

         string email = dt.Rows[0]["email"].ToString(); 

         SendEmailUsingGmail(email); 
         dt.Clear(); 
         dt.Dispose(); 
        } 
       } 
      } 

      ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), Guid.NewGuid().ToString(), "alert('Emails sent successfully');", true); 
     } 
     catch (Exception ex) 
     { 
      Response.Write("Error occured: " + ex.Message.ToString()); 
     } 
     finally 
     { 
      UserID = string.Empty; 
     } 
    } 

    private void SendEmailUsingGmail(string toEmailAddress) 
    { 
     try 
     { 
      SmtpClient client = new SmtpClient(); 
      client.Credentials = new System.Net.NetworkCredential("[email protected]", "helloapple"); 
      client.Host = "smtp.gmail.com"; 
      client.Port = 587; 
      client.EnableSsl = true; 

      MailAddress from = new MailAddress("[email protected]"); 
      string body = "Hello {1}, Thank you for subscribing to Jabez Events inc <br />" + txtBody.Text; 
      //  MailMessage mail = new MailMessage(txtSubject.Text, body); 
      MailMessage mail = new MailMessage(); 
      mail.From = from; 
      mail.To.Add(toEmailAddress); 
      mail.Subject = txtSubject.Text; 
      mail.IsBodyHtml = true; 
      mail.Body = body; 
      //client.DeliveryMethod = SmtpDeliveryMethod.Network; 
      client.Send(mail); 
     } 
     catch (Exception ex) 
     { 
      Response.Write("Error occured: " + ex.Message.ToString()); 
     } 
    } 

    protected void chkSelectAll_CheckedChanged(object sender, EventArgs e) 
    { 
     CheckBox chkAll = 
      (CheckBox)GridView1.HeaderRow.FindControl("chkSelectAll"); 
     if (chkAll.Checked == true) 
     { 
      foreach (GridViewRow gvRow in GridView1.Rows) 
      { 
       CheckBox chkSel = 
        (CheckBox)gvRow.FindControl("chkSelect"); 
       chkSel.Checked = true; 
      } 
     } 
     else 
     { 
      foreach (GridViewRow gvRow in GridView1.Rows) 
      { 
       CheckBox chkSel = (CheckBox)gvRow.FindControl("chkSelect"); 
       chkSel.Checked = false; 
      } 
     } 
    } 
} 
+0

要添加,我想通过在gridview中有复选框选项来选择哪个用户发送电子邮件,但是当我按下发送错误告诉我索引超出范围 – estiax

回答

0

实际上解决了这个问题,因为我没有加入 '用户名' 到我的gridview的最初阶段。对这篇文章感到抱歉。

相关问题