#c# #asp.net #textbox #radiobuttonlist
#c# #asp.net #текстовое поле #список radiobuttonlist
Вопрос:
В моей веб-форме у меня есть 6 текстовых полей и 6 списков RadioButtonLists:
Теперь я хочу отправить электронное письмо посетителю, чтобы сообщить, что они ввели и нажали на эти списки RadioButtonLists. Часть электронной почты работает нормально, но как мне связать все мои текстовые поля и RadioButtonLists в строку?
Пока у меня есть этот код:
protected void btnSubmit_Click1(object sender, EventArgs e)
{
//Specify senders gmail address
string SendersAddress = "test@gmail.com";
//Specify The Address You want to sent Email To(can be any valid email address)
string ReceiversAddress = "test@gmail.com";
//Specify The password of gmial account u are using to sent mail(pw of sender@gmail.com)
const string SendersPassword = "test";
//Write the subject of ur mail
const string subject = "Testing Items";
List<string> st1 = GetTextBoxesAndRadioButtons();
//string body = GetTextBoxes();
try
{
//we will use Smtp client which allows us to send email using SMTP Protocol
//i have specified the properties of SmtpClient smtp within{}
//gmails smtp server name is smtp.gmail.com and port number is 587
SmtpClient smtp = new SmtpClient
{
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
Credentials = new NetworkCredential(SendersAddress, SendersPassword),
Timeout = 3000
};
//MailMessage represents a mail message
//it is 4 parameters(From,TO,subject,body)
MailMessage message = new MailMessage(SendersAddress, ReceiversAddress, subject, "Test");
/*WE use smtp sever we specified above to send the message(MailMessage message)*/
smtp.Send(message);
Console.WriteLine("Message Sent Successfully");
Console.ReadKey();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public List<String> returnList = new List<String>();
private List<string> GetTextBoxesAndRadioButtons()
{
string txt;
foreach (Control ctr in Page.Controls)
{
CallControls(ctr);
}
return returnList;
}
private void CallControls(System.Web.UI.Control p)
{
string returntext = "";
foreach (Control ctrlMain in p.Controls)
{
if (ctrlMain.HasControls())
{
/* Recursive Call */
CallControls(ctrlMain);
}
if (ctrlMain is TextBox)
{
TextBox txt;
txt = (TextBox)FindControl(ctrlMain.ID);
returnList.Add(txt.Text);
}
else if (ctrlMain is RadioButton)
{
RadioButton rad;
rad = (RadioButton)FindControl(ctrlMain.ID);
returnList.Add(rad.Text);
}
}
}
Вот разметка для пользовательского интерфейса:
<tr>
<td class="style4">
<asp:Label ID="Label1" runat="server" Text="1. "></asp:Label>
<asp:TextBox ID="tbShoppingList1" runat="server"></asp:TextBox>
</td>
<td>
<asp:RadioButtonList ID="RadioButtonList1" runat="server" Height="16px"
RepeatDirection="Horizontal" Width="772px">
<asp:ListItem>CVS</asp:ListItem>
<asp:ListItem>Food Lion</asp:ListItem>
<asp:ListItem>Home Depot</asp:ListItem>
<asp:ListItem>Lowe`s</asp:ListItem>
<asp:ListItem>Publix</asp:ListItem>
<asp:ListItem>Target</asp:ListItem>
<asp:ListItem>Walgreens</asp:ListItem>
<asp:ListItem>WinDixie</asp:ListItem>
<asp:ListItem>Walmart</asp:ListItem>
</asp:RadioButtonList>
</td>
</tr>
Аналогично для следующих 5 текстовых полей и RadioButtonLists!
Это не работает.
‘st1’ ничего в нем не хранит.
Комментарии:
1. Не совсем понимаю, о чем вы здесь спрашиваете.
2. Страница. Элементы управления не являются рекурсивным списком элементов управления. Вместо того, чтобы сравнивать объекты, вам, вероятно, следует сравнить ctr. GetType() с помощью typeof(TextBox). Я также не вижу смысла создавать экземпляр объекта box?
3. Я бы применил грубую силу к этому с помощью инструкций if и двигался дальше. (мое скромное мнение)
4. @Gabriel: Я знаю, но я хочу знать концепцию 🙂
5. @John: Я обновил свой код. Надеюсь, из этого вы уловите суть.
Ответ №1:
Это должно сработать для обоих элементов управления. вы также можете разделить логику двумя разными методами. Это рекурсивно находит все текстовые поля и кнопки внутри page.controls. Объявите переменную returnList глобальной (доступной для обоих методов).
public List<String> returnList = new List<String>();
private List<string> GetTextBoxesAndRadioButtons()
{
string txt;
foreach (Control ctr in Page.Controls)
{
CallControls(ctr);
}
string finalstring = string.Join(",", returnList.ToArray());
return returnList;
}
private void CallControls(System.Web.UI.Control p)
{
string returntext = "";
foreach (Control ctrlMain in p.Controls)
{
if (ctrlMain.HasControls())
{
/* Recursive Call */
CallControls(ctrlMain);
}
if (ctrlMain is TextBox)
{
TextBox txt = (TextBox)ctrlMain;
//txt = (TextBox)FindControl(ctrlMain.UniqueID);
returnList.Add(txt.Text);
}
else if (ctrlMain is RadioButtonList)
{
RadioButtonList rad = (RadioButtonList)ctrlMain;
//rad = (RadioButtonList)FindControl(ctrlMain.UniqueID);
returnList.Add(rad.SelectedValue);
}
}
}
Комментарии:
1. Итак, в основном в моем списке возврата я буду вводить текст всех текстовых полей и кнопок radiolistbuttons?
2. Я попробовал Priyank. Но это даже не сохранение в List<string>. Смотрите мой обновленный ответ!
3. @Priyank: Это выдает мне следующую ошибку: ссылка на объект не установлена на экземпляр объекта. при этом: returntext = txt.Text;
4. вы взяли последний отредактированный код. У меня нет такой строки в этом коде, как «returntext = txt.Text;»
5. Добавьте некоторые проверки в код — например, findcontrol не возвращает null или txt.text /rad.text не равен null. В конечном итоге это должно сработать.
Ответ №2:
Приведение ctr к текстовому полю
if (ctr is TextBox)
{
textBoxes.Add((ctr as TextBox).Text);
}
Или лучше:
var tb = ctr as TextBox;
if( null != tb )
textBoxes.Add(cb.Text);
с последним вы избегаете вызова обоих is / as.
Ответ №3:
вам нужно преобразовать ctr в текстовое поле, а затем получить доступ к свойству «Text» вместо вызова «toString».. попробуйте:
List<string> textboxes = new List<string>();
foreach (Control c in this.Controls)
{
if (c is TextBox)
{
textboxes.Add(((TextBox)c).Text); //oops.. forgot a set of parenthesis had to come back and edit.
}
}
Приветствую,
CEC