0

这是我得到的错误-'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,然后它就可以正常工作,只要用户输入的地址用分号分隔即可。但是,winforms 中需要 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" />
4

3 回答 3

4

嗯,是的……txtEmailAddresses是一个TextBox。在 Windows 窗体WPF 中,您都不能遍历TextBox. 您需要该控件中获取文本。在 Windows 窗体中,您可以使用TextBox.Lines- 但您仍然不能遍历文本框。

的文档提供TextBox.LineCount了一些示例代码,说明如何遍历 WPF 中的行TextBox,尽管我会稍微修改它以使用 a 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;
}

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

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

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

(基本上,如果您将其设为多行,则使用第一个代码;如果您使用分号分隔的地址,则使用第二位。)

于 2013-04-02T15:47:15.880 回答
2

由于您的工具提示指出:

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

似乎文本框有一堆分号分隔的值。您需要首先从文本框中获取文本,然后将该单个字符串分解为多个字符串,然后才能获得一系列可以执行的操作foreach

foreach (string s in txtEmailAddresses.Text.Split(';'))
{
    message.To.Add(s);
}
于 2013-04-02T15:50:55.010 回答
0

您当然不能遍历单个TextBox,并且多行TextBox似乎只是对象上设置的属性,而不是子类。Text除了读取对象的字段TextBox并根据分号和/或换行符将其拆分为子字符串之外,我不确定如何做到这一点。然后您可以遍历拆分集合并执行您正在寻找的操作。

于 2013-04-02T15:51:31.747 回答