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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

10768閲覧

C#のtextboxの幅と高さをUserからの文字列に合わせて動的に可変

african

総合スコア17

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2021/12/06 01:19

編集2021/12/06 02:02

C#のtextboxの幅と高さを動的に変更する方法はありませんか?
defaultだと最初に幅と高さをデザイン画面では決めないといけないので、理想としては最初に初期値があり、ただuserからの入力文字列がそのwidthを超えたらまた改行して高さも超えたらtextboxの幅も高さも動的に変更されるようにしたいです。

すみません、追記します。
仕様環境は、
-Windoes Form(windows desktopのFormApp作成です)

  • Visual studio2019

Codeで、textoboxの生成について、
Form_Load methodに、

C#

1 2 TextBox txt1 = new TextBox(); 3 txt1.Name = "txt1"; 4 txt1.Location = new Point(1000, 2000); 5 6 txt1.Size = new Size(100, 100); 7 Controls.Add(txt1); 8

のようにして、textboxの表示は確認していますが、おそらくこのSize構造体?のところを動的にすればいい気はしてるのですがどうしたらいいでしょうか。。。

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

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

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

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

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

BeatStar

2021/12/06 01:46 編集

とりあえず、種類ぐらい提示したら?
退会済みユーザー

退会済みユーザー

2021/12/06 01:47

C# のアプリで作れるものは例えば WinForms, WPF, ASP.NET Web Forms その他いろいろあるということが分かってない。
BeatStar

2021/12/06 02:06

> Windoes Form Windows Formsでは?
african

2021/12/06 02:08

すみません、windows Formsでした。
BeatStar

2021/12/06 02:09

あと、サイズを変更したいのはTextBoxだけでしょうか? さらにFormのサイズが変更されたらどうなるでしょうか?
BeatStar

2021/12/06 02:10

入れ違いになりそうなので再度書きますが、サイズを変更したいのはTextBoxだけでしょうか? さらにFormのサイズが変更されたらどうなるでしょうか?
african

2021/12/06 02:17

何度もコメントしてみていただきありがとうございます。 当方、マインドマップアプリ(有名なもので言うとXmindやFreeMindのようなイメージです)のようなものを作ろうと考えていまして、いろいろ考えた結果、拙いアルゴリズムですが、VisualStudioのTextBox コントローラというものをキーボードショートカットキーで作成すれば、mindmapっぽいのができるのではないかと考え、その部分はなんとか実装してみたのですが、肝心のTextBox(mindmapでいう1つの文字列を入力する枝)がUserからの入力に合わせて幅も高さも可変的に大きくなってほしいと思い、この度ご質問させていただいた次第です。 話がそれてしまいましたが、Formのサイズが変更された際には、何も処理をせずつまりはTextBoxのサイズに変更はないようにしたいです。イメージ的には、Formのサイズが変更された場合、Form側に垂直水平スクロールバーを実装しているので、それによりTextBoxのサイズに関係なくUser側でスクロールすればmiindmapが見ることができるというのを想定しています。 長くなってしまい、申し訳ございません;
african

2021/12/06 02:19

サイズ変更はTextBoxのみで考えています。
guest

回答2

0

ベストアンサー

LabelAutoSizeのような動作ってことですよね?

TextBoxにもAutoSizeはあるんですが、期待した動作ではありません。
フォントを変えたときに、自動で1行の高さが変わるようです(そして規定でtrueです)
TextBoxBase.AutoSize Property (System.Windows.Forms) | Microsoft Docs

備考にあるように、RichTextBoxではどうでしょうか?

cs

1using System.Drawing; 2using System.Windows.Forms; 3 4namespace Questions372439 5{ 6 public partial class Form1 : Form 7 { 8 private readonly RichTextBox richTextBox1; 9 10 public Form1() 11 { 12 InitializeComponent(); 13 14 richTextBox1 = new RichTextBox 15 { 16 Location = new Point(12, 12), 17 MinimumSize = new Size(100, 19), 18 ScrollBars = RichTextBoxScrollBars.None, 19 WordWrap = false, 20 }; 21 richTextBox1.ContentsResized += richTextBox1_ContentsResized; 22 23 Controls.Add(richTextBox1); 24 } 25 26 private void richTextBox1_ContentsResized(object sender, ContentsResizedEventArgs e) 27 { 28 //richTextBox1.Size = e.NewRectangle.Size; 29 // 気持ち大きくしないと収まらない 30 richTextBox1.Size = new Size(e.NewRectangle.Width + 10, e.NewRectangle.Height + 10); 31 } 32 } 33}

投稿2021/12/06 08:33

編集2023/07/29 11:01
TN8001

総合スコア9862

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

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

0

TextChanged イベントが発生したら、Text プロパティから取得した文字列から必要な大きさを割り出して、Size プロパティにセットするだけです。
(実装しているうちにいろいろ調整する部分は出てくると思いますが)

文字列を表示するための大きさを求める部分はこんな感じで、あとは枠や余白を考慮してください。

C#

1using System.Drawing; 2using System.Windows.Forms; 3 4class TextBoxUTL 5{ 6 public static Size GetTextSize(TextBox textBox) 7 { 8 return GetTextSize(textBox, SystemInformation.MaxWindowTrackSize); 9 } 10 11 public static Size GetTextSize(TextBox textBox, Size proposedSize) 12 { 13 using (var g = textBox.CreateGraphics()) { 14 return TextRenderer.MeasureText(g, 15 textBox.Text, 16 textBox.Font, 17 proposedSize, 18 CreateTextFormatFlags(textBox)); 19 } 20 } 21 22 public static TextFormatFlags CreateTextFormatFlags(TextBox textBox) 23 { 24 TextFormatFlags format = TextFormatFlags.NoPrefix | TextFormatFlags.ExpandTabs 25 | TextFormatFlags.NoClipping | TextFormatFlags.NoPadding; 26 if (!textBox.Multiline) { 27 format |= TextFormatFlags.SingleLine; 28 } else if (textBox.WordWrap) { 29 format |= TextFormatFlags.WordBreak; 30 } 31 32 if (textBox.RightToLeft == RightToLeft.Yes) { 33 format |= TextFormatFlags.RightToLeft; 34 switch (textBox.TextAlign) { 35 case HorizontalAlignment.Center: 36 format |= TextFormatFlags.HorizontalCenter; 37 break; 38 39 case HorizontalAlignment.Right: 40 format |= TextFormatFlags.Left; 41 break; 42 43 default: 44 format |= TextFormatFlags.Right; 45 break; 46 } 47 } else { 48 switch (textBox.TextAlign) { 49 case HorizontalAlignment.Center: 50 format |= TextFormatFlags.HorizontalCenter; 51 break; 52 53 case HorizontalAlignment.Right: 54 format |= TextFormatFlags.Right; 55 break; 56 57 default: 58 format |= TextFormatFlags.Left; 59 break; 60 } 61 } 62 return format; 63 } 64}

投稿2021/12/06 04:45

KOZ6.0

総合スコア2707

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問