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

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

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

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

Visual Studio

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

Q&A

解決済

4回答

5243閲覧

numericUpDownの桁数制限

TEU7

総合スコア1

C#

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

Visual Studio

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

0グッド

0クリップ

投稿2021/05/05 13:34

編集2021/05/05 13:37

前提・実現したいこと

C#でnumericUpDownを使用して桁数を1桁に制限したいです。
ネットや書籍で調べていく中で、C#|メモ帳を参考にして
以下のソースコードのようなような書き方で実現できることはわかりました。

発生している問題

Controls[1]の部分について、TextBoxの情報があるということですが それをVisualStudio等でどのようにして確認できるのかがわかりません。 「自分で説明できないコードは1行たりとも書くな!」と言われているため 理解した上でコーディングしたいと思い手持ちの書籍やネット等を調べてみたのですが、どうしてもわかりません。 お手数ですが、ご教示いただけますでしょうか。

該当のソースコード

C#

1((TextBox)numericUpDown1.Controls[1]).MaxLength = 1;

補足情報(FW/ツールのバージョンなど)

VisualStudio2017
WindowsForm

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

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

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

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

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

guest

回答4

0

ベストアンサー

例えば、以下のようなコードを書くと

C#

1for (int i = 0; i < numericUpDown1.Controls.Count; i++) { 2 Console.WriteLine(numericUpDown1.Controls[i].GetType()); 3}
System.Windows.Forms.UpDownBase+UpDownButtons System.Windows.Forms.UpDownBase+UpDownEdit

のように出力されます。
numericUpDown1.Controls[1]は上記の「UpDownEdit」の事なので、これが何かを知ればよい事になります。
.NET Frameworkのソースコードは公開されているので「UpDownEdit Source Code」のように検索すると
UpDownBase.cs - Reference Source - Microsoft
が出てくるので、調べてみると、UpDownEditはTextBoxを継承したクラスだという事がわかります。

C#

1internal class UpDownEdit : TextBox{

で、NumericUpDownとの関係は?となるので、「NumericUpDown Source code」で検索して
NumericUpDown.cs - Reference Source - Microsoft
ソースコードを見てみると、

C#

1public class NumericUpDown : UpDownBase, ISupportInitialize {

NumericUpDownはUpDownBaseを継承しているクラスでした。

ただ、個人的にはNumericUpDownの「Maximum」「Minimum」を設定すれば良いんじゃね?って思います。

投稿2021/05/05 14:51

Hey_CH

総合スコア437

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

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

Hey_CH

2021/05/05 14:52

ああ、似たような回答が既に書かれていました、すいません。
TEU7

2021/05/05 15:23

>Hey_CH様 ご回答いただきありがとうございます。 ようやく理解できました! これでコーディングの方も進められそうです。 MaximumとMinimumにつきましては、tettyA様への返信でも書かせていただきましたが、 制御できるのはnumericUpDownに付属するボタン操作での事のようでした。
Hey_CH

2021/05/05 16:00

詳しい要件はわかりませんが、桁だけでなく、MaximumとMinimumの値で制御しないといけない場合があるかもしれません。 その時は、以下のような感じのコードで対応した方が良いかもしれません。 var tb = numericUpDown1.Controls[1] as TextBox; if (tb != null) { tb.TextChanged += (s, e) => { decimal d = 0; if (decimal.TryParse(tb.Text, out d)) { if (d > numericUpDown1.Maximum) { d = numericUpDown1.Maximum; } else if (d < numericUpDown1.Minimum) { d = numericUpDown1.Minimum; } tb.Text = d.ToString(); } }; }
退会済みユーザー

退会済みユーザー

2021/05/05 16:21 編集

個人的には、非公開コントロールを弄るのはあまりお勧めできないですね。その手の裏技を使った場合、バージョン変わって内部実装変わって使用出来なくなっても文句いえないので。(そうそう変わるものでもないとは思いますが一応)
Hey_CH

2021/05/05 16:29

確かにその通りですが、上司の要求に対応する例って事でかいておきました。 (((TextBox)numericUpDown1.Controls[1]).MaxLength = 1;では対応できない場合の対処として) ※標準コントロールを使用しないとダメって場合もあるかもしれない。
退会済みユーザー

退会済みユーザー

2021/05/05 16:33

標準の動きをバグとし、そのために新たなバグを生みそうな非標準な処理を盛り込むのが闇だなぁと感じます。(過去にそういった事はありましたが)
Hey_CH

2021/05/05 22:55

「これが標準の動きです」と説明して、お客さんや上司が理解し、納得してくれればそれに越したことはありませんね。
guest

0

NumericUpDown継承したカスタムコントロールを作成して、OnTextChanged辺りをオーバーライドしてTextプロパティ加工したらいけるかもしれません。
ただ、複合コントロールの標準の動きを変えるという事は、それだけ想定外のバグが出やすくなる事だけは念頭に置いてください。
(マイナス値の扱いとかどするんだろうとか)

投稿2021/05/05 16:02

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

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

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

TEU7

2021/05/05 15:07

>hidori様 ご回答いただきありがとうございます。 確認させていただきます。
guest

0

numericUpDownにはMaximumというプロパティがあるのでそれで最大値が指定できます。

投稿2021/05/05 14:36

tettyA

総合スコア93

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

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

TEU7

2021/05/05 15:01

>tettyA様 ご回答いただきありがとうございます。 自分でもMaximumプロパティを設定していたのですが、こちらで制限できるのは numericUpDownに付属しているボタン操作での上限値のみのようでした。 そのため、キーボードから直接数値を入力すると、二桁以上の入力が可能な状態です。
退会済みユーザー

退会済みユーザー

2021/05/05 15:10

入力出来ても実際には適用されていないので、フォーカス移動等でValueChangedが走った時点で最大値にクリップされると思いますが。
TEU7

2021/05/05 15:28

>radian様 コメントいただきありがとうございます。 こちらの記載不足が多く申し訳ありません。 仰る通りなのですが、入力方法を問わず見た目上の入力可能桁数も1桁とする事を求められております。 そのため、見た目がそのような状態になればその時点でバグ扱いになると言われております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問