質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

3392閲覧

C# TextBoxでスペースを入力すると、自動改行時にスペースを入力した所が改行される。

.......

総合スコア23

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2021/11/20 04:57

編集2021/11/20 05:46

C#で自動改行するTextBoxを追加したいのですが、
タイトルの通り、TextBoxでスペースを入力すると、自動改行時にスペースを入力した所が改行されてしまいます。
イメージ説明
このようにTextBoxにスペースを入力すると、
イメージ説明
このようになってしまいます。
このようにならないようにするには、どうすればいいでしょうか?

C#

1public Form1() 2{ 3 textBox1.Location = new Point(0,0); 4 textBox1.Size = new Size(100,100); 5 textBox1.Multiline = true; 6 this.Controls.Add(textBox1); 7}

目標

イメージ説明
このようにスペースを入力しても、正常に自動改行するようにしたいです。

環境

Windows10 Home
FrameWork4.7
VisualStudio2022
WindowsForm

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cx20

2021/11/20 05:00

ワードラップの処理かと思いますが、折り返しさせずに横スクロールするようにしたい、ということでしょうか?(ワードラップの処理はWindowsのメモ帳でも同様の動作かと思います。)
退会済みユーザー

退会済みユーザー

2021/11/20 05:42

何を作っているか(WinForms? WPF? ASP.NET Web Forms? その他?)と開発環境(OS, Visual Studio のバージョン、Core か .NET Framework のどっちかとそのバージョンなど)ぐらいは書こう。
退会済みユーザー

退会済みユーザー

2021/11/20 05:46

欧文の word wrap、日本語の禁則処理というのを知ってますか? それを知った上での話ですか?
.......

2021/11/20 05:54

知らなかったです。今調べました。 今それを知った上での話です。
Zuishin

2021/11/20 06:03

どうなってほしいのかよくわからないけど、TextBox をやめて ListBox にすればいいのでは?
退会済みユーザー

退会済みユーザー

2021/11/20 06:05

欧文の word wrap、日本語の禁則処理を知ったら質問のようなことは諦めるという話になるかと思っていましたが・・・ 前のスレッドの話のように、もともとのやりたいことができる別の方法を考えてみるのが良さそうな気がします。
.......

2021/11/20 06:29

ListBoxだと入力ができません。まぁListViewを使ったらできそうなので、試してみます。
.......

2021/11/20 06:34

SurferOnWwwさん 考えてみました。textboxにスペースが入力されたら、スペースを入力した以前の文字列をlabelに追加し、後で結合させればできると思います。
Zuishin

2021/11/20 06:36

何に使うかも不明なものなので、あれができないこれができない言われても知らんがなとしか。 ListView でも DataGridView でも、カスタムコントロールでも、自分で考えて好きなものを使えばいいでしょう。
guest

回答3

0

ベストアンサー

とりあえず、こんな感じでいかがでしょう。
ダブルクリックしたときの挙動に違和感があったので EditWordBreak を修正しました。

C#

1const int EM_SETWORDBREAKPROC = 0xD0; 2const int WB_LEFT = 0; 3const int WB_RIGHT = 1; 4const int WB_ISDELIMITER = 2; 5 6[DllImport("user32")] 7private static extern IntPtr SendMessage(IntPtr hWnd, int msgId, IntPtr wParam, EditWordBreakProc lParam); 8private delegate int EditWordBreakProc(IntPtr ipch, int ichCurrent, int cch, int code); 9 10private void Form1_Load(object sender, EventArgs e) 11{ 12 textBox1.Multiline = true; 13 textBox1.WordWrap = true; 14 SendMessage(textBox1.Handle, EM_SETWORDBREAKPROC, IntPtr.Zero, EditWordBreak); 15} 16 17private int EditWordBreak(IntPtr ipch, int ichCurrent, int cch, int code) 18{ 19 switch (code) 20 { 21 case WB_ISDELIMITER: 22 return 0; 23 case WB_LEFT: 24 return 0; 25 case WB_RIGHT: 26 return cch; 27 } 28 return 0; 29}

投稿2021/11/20 07:29

編集2021/11/23 06:37
KOZ6.0

総合スコア2707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cx20

2021/11/20 07:47

EM_SETWORDBREAKPROC メッセージ知りませんでした。勉強になります!
.......

2021/11/20 10:05

回答ありがとうございます。 無事に解決できました。
guest

0

ちゃんとやろうとしたら結構難しいと思います。
テキストボックスの右端に達しているか否かを調べるにはフォントの幅を計算する等の処理が必要があり、結構面倒です。

以下は簡易的な対応例になります。
単純にカーソル位置の桁数が指定文字数を超過した場合に改行コードを付加する例です。
※ カーソルが最後行・最後尾にある場合にのみ動作します。テキストボックスの途中に文字が挿入されるようなケースには対応していません。

C#

1[System.Runtime.InteropServices.DllImport("User32.Dll")] 2private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); 3 4private const int EM_LINEINDEX = 0xBB; 5private const int EM_LINEFROMCHAR = 0xC9; 6 7public Form1() 8{ 9 InitializeComponent(); 10} 11 12private void textBox1_KeyDown(object sender, KeyEventArgs e) 13{ 14 int lineIndex = SendMessage(textBox1.Handle, EM_LINEINDEX, -1, 0); 15 int col = textBox1.SelectionStart - lineIndex + 1; 16 17 if (col > 15) 18 { 19 textBox1.Text += Environment.NewLine; 20 textBox1.Select(textBox1.Text.Length, 0); 21 } 22}

イメージ説明

<参考>
■ TextBox(またはRichTextBox)の現在のカレット位置(行と列)を取得する
https://dobon.net/vb/dotnet/control/tbgetcaretposition.html

投稿2021/11/20 07:21

編集2021/11/20 07:23
cx20

総合スコア4648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cx20

2021/11/20 07:44

KOZ6.0 さんの回答がスマートで良さそうですね。
guest

0

TextBoxのプロパティ、WordWrapをFalseとしましょう

投稿2021/11/20 05:10

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

.......

2021/11/20 05:27

そうすると折り返さなくなりますが、その時はどうすればいいでしょうか?
y_waiwai

2021/11/20 05:34

自動的に折り返さくなる設定なのでそういうもんです スクロールバーを表示させれば左右に動かせれるのでそんではどうでしょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問