0

「System.Windows.Controls.Textbox には GetEnumerator のパブリック定義が含まれていないため、foreach ステートメントは System.Windows.Controls.Textbox 型の変数に対して操作できません」というエラーが表示されます。

私のコード:

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を使用するように少し変更します。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(';');

(基本的に、複数行にする場合は最初のコードを使用し、セミコロンで区切られたアドレスを使用する場合は 2 番目のビットを使用します。)

于 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 に答える