#c# #email #gridview #checkbox
#c# #Адрес электронной почты #gridview #флажок
Вопрос:
Я хотел бы получить некоторую помощь в решении следующей проблемы. Я пытаюсь отправлять электронные письма пользователям, которые отмечены в gridview. Я поискал вокруг и нашел много похожих тем, но я не смог найти рабочее решение. Ну, я знаю, что мне чего-то не хватает, возможно, в моем операторе выбора. Но я не могу в этом разобраться.
Мой код показывает gridview, скажем, с двумя пользователями, множеством элементов и адресами электронной почты от пользователей. Я выбрал по 1 элементу для каждого пользователя, поэтому следует отправить 2 электронных письма. отправляются 2 письма, но только на 1 адрес электронной почты, адрес электронной почты, который он встречает первым в базе данных. Я пытался выполнить поиск по идентификатору пользователя, но не смог заставить это работать, я все еще в первые несколько месяцев разработки в .net.
Смотрите здесь мой код:
public void Email()
{
string conn = "Data Source=pc-...";
LabelSendGridAbove.Text = "<b>Title</b><br /><br /> Text... <br /><br /> ";
LabelSendGridBetween.Text = "<br /><br /> More text. "
"<br /><br /><br /> Regards, <br /><br /> " ;
LabelSendGridUnder.Text = "<br /><br />--------------------------------------";
System.Data.SqlClient.SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection(conn);
sqlConn.Open();
SqlCommand sendGrid =
new SqlCommand("SELECT statement for gridview which will be send in the email ", sqlConn);
GridView grd = new GridView();
// Css for the gridview which will be send in mail
grd.BorderStyle = System.Web.UI.WebControls.BorderStyle.None;
grd.GridLines = GridLines.None;
grd.RowStyle.HorizontalAlign = HorizontalAlign.Center;
grd.Width = 600;
foreach (DataControlField field in grd.Columns)
{
field.ItemStyle.Width = Unit.Percentage(100 / grd.Columns.Count);
}
if (sendGrid != null)
{
grd.DataSource = sendGrid.ExecuteReader();
grd.DataBind();
}
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter htw = new HtmlTextWriter(sw);
grd.RenderControl(htw);
sqlConn.Close();
foreach (GridViewRow r in GridViewOrder.Rows)
{
if (((CheckBox)r.Cells[0].FindControl("CheckBoxGetProduct")).Checked == true )
{
System.Data.SqlClient.SqlConnection sqlConn3 = new System.Data.SqlClient.SqlConnection(conn);
sqlConn3.Open();
if (((Label)r.Cells[0].FindControl("LabelEmailUsr")) != null)
{
Label txtUser = (Label)GridViewOrder.FindControl("LabelEmailUsr");
if (txtUser != null)
{
LabelTestMail.Visible = true;
LabelTestMail.Text = txtUser.Text.ToString();
}
SqlCommand emailAdres = new SqlCommand("SELECT tblUsers.tUserEmail FROM tblUsers", sqlConn3);
GridViewOrder.DataBind();
string email = Convert.ToString(emailAdres.ExecuteScalar());
LabelTestMail.Text = email;
try
{
MailMessage mail = new MailMessage();
mail.To.Add(email.ToString());
mail.Bcc.Add("SomeEmail");
mail.From = new MailAddress("FromWho");
mail.Subject = "SomeSubject";
string Body = LabelSendGridAbove.Text sb.ToString() LabelSendGridBetween.Text "<br /><img alt="" hspace=0 src="cid:imageId" align=baseline border=0 >" LabelSendGridUnder.Text "<BR>";
AlternateView htmlView = AlternateView.CreateAlternateViewFromString(Body, null, "text/html");
LinkedResource imagelink = new LinkedResource(Server.MapPath(".") @"logoLogo.jpg");
imagelink.ContentId = "imageId";
imagelink.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;
htmlView.LinkedResources.Add(imagelink);
mail.AlternateViews.Add(htmlView);
SmtpClient smtp = new SmtpClient("relay.skynet.be");
smtp.Send(mail);
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
}
}
}
Я надеюсь, что в этом коде не слишком много ошибок. Но если кто-нибудь знает, что я должен добавить в код, чтобы заставить его работать, чтобы он отправлял 2 электронных письма на 2 разных адреса электронной почты, что было бы очень приятно.
Спасибо.
Комментарии:
1. Я изменил код, чтобы он имел больше смысла. Хотя проблема все та же.
Ответ №1:
Если я правильно понимаю, отправляются два письма, но только на один адрес … первый адрес из DB…am Я прав?
Если это так, то проблемная строка
SqlCommand emailAdres = new SqlCommand("SELECT tblUsers.tUserEmail FROM tblUsers", sqlConn3);
Мне кажется, что вы вызываете один и тот же адрес электронной почты на каждой итерации for…каждый цикл. Попробуйте добавить предложение where и параметр поиска.
Комментарии:
1. Здравствуйте, спасибо за ваш ответ. Я попытался добавить предложение where, но мне трудно написать правильный код. На данный момент это выглядит так:
Label lblUsrId = (Label)GridViewOrder.FindControl("LabelId"); SqlCommand emailAdres = new SqlCommand("SELECT tblGebruikers.tUsrId, tblUsers.tUsrEmail " "FROM tblUsers WHERE tUsrId=@tUsrId", sqlConn3); emailAdres.Parameters.AddWithValue("@tUsrId", lblUsrId); GridViewOrder.DataBind(); string email = Convert.ToString(emailAdres.ExecuteScalar());
я получаю ошибку в последней строке.2. Изменил предложение where на:
Label lblUsrId = (Label)GridViewOrder.FindControl("LabelId"); SqlCommand emailAdres = new SqlCommand("SELECT tblUsers.tUsrEmail FROM tblUsers WHERE tUsrId=@tUsrId", sqlConn3); emailAdres.Parameters.AddWithValue("@tUsrId", lblUsrId.Text); emailAdres.ExecuteScalar();
Новая ошибка гласит: ссылка на объект не установлена на экземпляр объекта. Я вроде как застрял здесь.