Перебор текстовых полей и списков радиокнопок

В моей веб-форме у меня есть 6 текстовых полей и 6 радиокнопок:

Теперь я хочу отправить посетителю электронное письмо о том, что бы они ни ввели и не нажали на этот RadioButtonLists. Часть электронной почты работает нормально, но как мне связать все текстовые поля и RadioButtonLists в строку?

У меня есть этот код до сих пор:

         protected void btnSubmit_Click1(object sender, EventArgs e)
    {
        //Specify senders gmail address
        string SendersAddress = "[email protected]";

        //Specify The Address You want to sent Email To(can be any valid email address)
        string ReceiversAddress = "[email protected]";

        //Specify The password of gmial account u are using to sent mail(pw of [email protected])
        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' ничего в нем не хранит.


person RG-3    schedule 11.04.2011    source источник
comment
Не совсем понимаю, что вы здесь спрашиваете.   -  person John Batdorf    schedule 12.04.2011
comment
Page.Controls не является рекурсивным списком элементов управления. Вместо того, чтобы сравнивать объекты, вам, вероятно, следует сравнить ctr.GetType() с typeof(TextBox). Я также не вижу смысла создавать экземпляр объекта box?   -  person lukiffer    schedule 12.04.2011
comment
Я бы переборщил это с операторами if и пошел дальше. (мое скромное мнение)   -  person Aaron Anodide    schedule 12.04.2011
comment
@Gabriel: я знаю, но я хочу знать концепцию :)   -  person RG-3    schedule 12.04.2011
comment
@John: я обновил свой код. Надеюсь, из этого вы извлечете суть.   -  person RG-3    schedule 12.04.2011
comment
меня устраивает. Я обновил свой код для RadioButtonList. см. мой комментарий.   -  person Priyank    schedule 12.04.2011


Ответы (3)


Это должно сделать это для обоих элементов управления. вы также можете разделить логику двумя разными способами. Это рекурсивно находит все текстовые поля и радиокнопки с 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);
                }
    }


}
person Priyank    schedule 11.04.2011
comment
Итак, в моем списке возврата я ввел текст всех текстовых полей и кнопок радиосписка? - person RG-3; 12.04.2011
comment
Я попробовал Приянка. Но он даже не сохраняется в List‹string›. Смотрите мой обновленный ответ! - person RG-3; 12.04.2011
comment
@Priyank: это дает мне эту ошибку: ссылка на объект не указывает на экземпляр объекта. при этом: returntext = txt.Text; - person RG-3; 12.04.2011
comment
вы взяли последний отредактированный код. У меня в этом коде нет такой строчки как returntext = txt.Text; - person Priyank; 12.04.2011
comment
Добавьте некоторые проверки в код, например, findcontrol не возвращает значение null или txt.text/rad.text не равно null. В конце концов, это должно сработать. - person Priyank; 12.04.2011
comment
@Priyank: я пробовал с обновленным кодом, а также заполнил текстовые поля значениями. Тем не менее он показывает мне эту ошибку: ссылка на объект не указывает на экземпляр объекта в returnList.Add(txt.Text); - person RG-3; 12.04.2011
comment
когда вы отлаживаете его, возвращает ли он управление текстовым полем в этой строке txt = (TextBox)FindControl(ctrlMain.ID); ? - person Priyank; 12.04.2011
comment
@Priyank: я проверяю эту строку: txt = (TextBox) FindControl (ctrlMain.ID); Значение в txt равно нулю - person RG-3; 12.04.2011
comment
@Priyank: Извините, но у меня есть RadioButtonList и под ним 7 asp:ListItem. Итак, технически я получаю значение от RadioButton? - person RG-3; 12.04.2011
comment
Это работает как шарм на моей стороне. Я обновил еще, если условие для RadioButtonList вместо RadioButton. кроме этого, он возвращает мне два значения в списке возврата: одно для текстового поля и одно для выбранного значения радиокнопки. - person Priyank; 12.04.2011
comment
Попробуйте UniqueID, чтобы узнать, поможет ли он вам обрести контроль. txt = (TextBox)FindControl(ctrlMain.UniqueID); - person Priyank; 12.04.2011
comment
Я обновил код. Попробуй это. кажется, нет необходимости использовать FindControl. Мы можем просто передать управление. - person Priyank; 12.04.2011
comment
@Priyank: Круто, я только что проверил, что в моем списке возврата есть элементы. Как ввести его в строку? Я хочу, чтобы этот «returnList» был внутри строки! - person RG-3; 12.04.2011
comment
Как преобразовать List‹string› в строку? - person RG-3; 12.04.2011
comment
используйте эту строку finalstring = string.Join(,, returnList.ToArray()); - person Priyank; 12.04.2011

Привести ctr к TextBox

if (ctr is TextBox)
            {
                textBoxes.Add((ctr as TextBox).Text);  
            }

Или лучше:

var tb = ctr as TextBox;
if( null != tb )
       textBoxes.Add(cb.Text); 

с последним вы избегаете называть оба is/as.

person Felice Pollano    schedule 11.04.2011

вам нужно указать ctr как текстовое поле, а затем получить доступ к свойству «Текст», а не вызывать «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.
            }
         }

С уважением, ЦИК

person Cos Callis    schedule 11.04.2011