foreach语句不能对System.Windows.Controls.Textbox类型的变量进行操作

时间:2013-04-02 15:44:42

标签: c# wpf foreach wpf-controls

这是我得到的错误 - 'foreach语句无法对System.Windows.Controls.Textbox类型的变量进行操作,因为System.Windows.Controls.Textbox不包含GetEnumerator的公共定义。'

我的代码:

private void btnSendEmail_Click_1(object sender, RoutedEventArgs e)
        {
            MailMessage message = new MailMessage();
            message.From = new MailAddress(txtEmail.Text);
            message.Subject = txtSubject.Text;
            message.Body = txtBody.Text;
            foreach (string s in txtEmailAddresses)
            {
                message.To.Add(s);
            }

            SmtpClient client = new SmtpClient();
            client.Credentials = new NetworkCredential();
        }

在'foreach'上有一个红色的波浪形下划线表示该错误。文本框应该是一个多行文本框。使用winForms这很容易。我可以转到属性窗口并将多行属性设置为true,然后它可以正常工作,只要用户输入的地址用分号分隔即可。但是,在winform中需要2秒钟的所有内容都需要成为WPF中的一个大问题,所以我在WPF文本框中遇到了这个错误。有谁知道我为什么会收到这个错误以及怎么办?这里也是我的xaml,如果有一些我缺少的属性需要在文本框上设置以使其成为多行或其他东西。

<Label Content="Recipients:"
               HorizontalAlignment="Left"
               Margin="26,10,0,0"
               VerticalAlignment="Top" />
        <Label Content="Subject:"
               HorizontalAlignment="Left"
               Margin="26,114,0,0"
               VerticalAlignment="Top" />
        <TextBox x:Name="txtEmailAddresses"
                 HorizontalAlignment="Left"
                 Height="73"
                 Margin="26,36,0,0"
                 TextWrapping="Wrap"
                 VerticalAlignment="Top"
                 Width="278"
                 ToolTip="When providing multiple email addresses, separate them with a semi colon" />
        <TextBox x:Name="txtSubject"
                 HorizontalAlignment="Left"
                 Height="23"
                 Margin="81,117,0,0"
                 TextWrapping="Wrap"
                 VerticalAlignment="Top"
                 Width="223" />

3 个答案:

答案 0 :(得分:4)

好吧...... txtEmailAddressesTextBox。在Windows窗体 WPF中都不能迭代TextBox。您需要从控件获取文本。在Windows窗体中,您可以使用TextBox.Lines - 但您仍然无法只是遍历文本框。

TextBox.LineCount的文档提供了一些示例代码,用于如何迭代WPF TextBox中的行,尽管我稍微修改它以使用List<string>,可能作为扩展方法:

private static List<string> GetLines(this TextBox textBox)
{
    List<string> lines = new List<string>();

    // lineCount may be -1 if TextBox layout info is not up-to-date.
    int lineCount = textBox.LineCount;

    for (int line = 0; line < lineCount; line++)
    {
        lines.Add(textBox.GetLineText(line));
    }
    return lines;
}

(当然,您可以使用迭代器块返回IEnumerable<string>,但是当您迭代它时,您需要确保没有更改控件中的数据。)

但是,鉴于您的工具提示,您真正需要的只是:

string[] addresses = txtEmailAddresses.Text.Split(';');

(基本上,如果你使用多行代码,请使用第一个代码;如果你使用以分号分隔的地址,请使用第二个代码。)

答案 1 :(得分:2)

由于您的工具提示声明:

  

提供多个电子邮件地址时,请用分号

分隔

看起来文本框中有一堆以分号分隔的值。您需要首先从文本框中获取文本,然后在您有一系列事情foreach之前将该单个字符串分解为多个字符串:

foreach (string s in txtEmailAddresses.Text.Split(';'))
{
    message.To.Add(s);
}

答案 2 :(得分:0)

你当然不能迭代单个TextBox,而多行TextBox似乎只是对象而不是子类的属性集。除了读取Text对象的TextBox字段并将其拆分为基于分号和/或换行符的子字符串之外,我不确定如何做到这一点。然后你可以迭代拆分集合并做你想要的。