none
チャットのEnterキーを押した後、次に改行が残る RRS feed

  • 質問

  • チャットを作っているのですがtextbox1で入力した内容をtextbox2に追記して

    textbox1を空にすると改行がtextbox1に残ってしまい1段下がった状態に

    なってしまいます。

     

    おそらく、キーダウンに反応した時、イベント処理を行ってからそのときのEnterを

    入力してしまっているからだと思います。

    これを回避する方法をご存知の方いらっしゃいましたら

    ご連絡いただけましたら幸いです。

     

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter & e.Modifiers != Keys.ControlKey)
                {
                        textBox2.Text += textBox1.Text;

                        textBox1.Text = "";
                        textBox1.Focus();
                }
            }

    2011年11月10日 13:56

回答

  • 最初の質問でのこのコードを見ていただければご理解いただけると思います。

    すみません、見直しサボって見落としました。
    このコードから察するに改行することはほとんどない(送信よりも優先度が低い)ということでしょうか。
    # 手元に実験コード作っておいてよく見てなかった…。

    IME などによって性質が変わるかもしれませんが、KeyPress イベントを使ってみてはいかがでしょうか。
    KeyChar == (char)Keys.Enter && Control.ModifierKeys != Keys.Control みたいな条件で e.Handled = true; にしてやればできそうかなぁ。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク 山本春海 2011年11月25日 8:53
    2011年11月12日 3:21
    モデレータ
  • ご返答ありがとうございます。結論から申し上げますと下記のようにしたらできました。

    皆様ご回答ありがとうございます。

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (e.KeyChar == (char)Keys.Enter & e.KeyChar != (char)Keys.ControlKey)//AltでもShiftどっちでも結果は一緒でした。
                {

                        textBox2.Text += textBox1.Text;

                        textBox1.Text = "";

                        e.Handled = true;
                }          
            }

    • 回答としてマーク 山本春海 2011年11月25日 8:53
    2011年11月15日 11:07

すべての返信

  • 以下のどちらかで解決できるでしょう。

    ・textBox1のMultilineをfalseにする。
    ・KeyDownイベントではなくKeyUpイベントを使用する。

     

    2011年11月10日 16:17
  • NF64さん返信ありがとうございます。

     

    まず、Multilineをfalseにする件ですが複数行のチャットを作りたいので

    KeyUpイベントの方法を採用しました。

    できました。大変ありがとうございます。と喜んだのも束の間

    今度は別の副作用が出てしまいました。

    KeyUpイベントだと日本語変換のEnterでイベントが発生してしまい

    本当は続けて文章を書きたいのにそこで送信されてしまいます。

    帯に短し襷に流しですね・・・とほほ

     

    2011年11月12日 2:39
  • 改行、IME での確定を単なる Enter キー、チャットの送信を Ctrl+Enter キーとかにすればよいのでは。

    今の話では、複数行入力のための改行での Enter キー押下と送信のための Enter キー押下が区別つかないように聞こえるので。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年11月12日 2:55
    モデレータ
  • 最初の質問での

    if (e.KeyCode == Keys.Enter & e.Modifiers != Keys.ControlKey)
                {}

    このコードを見ていただければご理解いただけると思います。

    2011年11月12日 3:01
  • 最初の質問でのこのコードを見ていただければご理解いただけると思います。

    すみません、見直しサボって見落としました。
    このコードから察するに改行することはほとんどない(送信よりも優先度が低い)ということでしょうか。
    # 手元に実験コード作っておいてよく見てなかった…。

    IME などによって性質が変わるかもしれませんが、KeyPress イベントを使ってみてはいかがでしょうか。
    KeyChar == (char)Keys.Enter && Control.ModifierKeys != Keys.Control みたいな条件で e.Handled = true; にしてやればできそうかなぁ。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク 山本春海 2011年11月25日 8:53
    2011年11月12日 3:21
    モデレータ
  • 試していませんが、Ctrl + Enter ではなく Alt + Enter を使ってみてはどうでしょうか?

    # Multilineの場合、TextBoxは Ctrl + Enter ではなく Alt + Enter を特別扱いしてるような気がします。

    2011年11月14日 0:22
  • ご返答ありがとうございます。結論から申し上げますと下記のようにしたらできました。

    皆様ご回答ありがとうございます。

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (e.KeyChar == (char)Keys.Enter & e.KeyChar != (char)Keys.ControlKey)//AltでもShiftどっちでも結果は一緒でした。
                {

                        textBox2.Text += textBox1.Text;

                        textBox1.Text = "";

                        e.Handled = true;
                }          
            }

    • 回答としてマーク 山本春海 2011年11月25日 8:53
    2011年11月15日 11:07