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

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

ただいまの
回答率

88.36%

ボタンクリックとテキストボックスの切り替えについて

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,012

pj7577bm60v

score 13

前提・実現したいこと

数字ボタンをクリックしたときにテキストボックス1,2,3、に数字が表示させたい。
イメージ説明

発生している問題・エラーメッセージ

数字ボタンをクリックしたときにテキストボックス1,2,3にそれぞれに表示させれるように切り替えの
ボタンを用意したのですが、メソッドが上手く作れず切り替えボタンが上手く作動しません。

C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        string num = "0";
        string num1 = "1";
        string num2 = "2";
        string num3 = "3";
        string num4 = "4";
        string num5 = "5";
        string num6 = "6";
        string num7 = "7";
        string num8 = "8";
        string num9 = "9";
        string num0 = "0";

        public Form1()
        {
            InitializeComponent();
        }



        private void button1_Click(object sender, EventArgs e)
        {
            num = num += num1;
            textBox1.Text = num;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            num = num += num2;
            textBox1.Text = num;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            num = num += num3;
            textBox1.Text = num;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            num = num += num4;
            textBox1.Text = num;
        }

        private void button5_Click(object sender, EventArgs e)
        {
            num = num += num5;
            textBox1.Text = num;
        }

        private void button6_Click(object sender, EventArgs e)
        {
            num = num += num6;
            textBox1.Text = num;
        }

        private void button7_Click(object sender, EventArgs e)
        {
            num = num += num7;
            textBox1.Text = num;
        }

        private void button8_Click(object sender, EventArgs e)
        {
            num = num += num8;
            textBox1.Text = num;
        }

        private void button9_Click(object sender, EventArgs e)
        {
            num = num += num9;
            textBox1.Text = num;
        }

        private void button10_Click(object sender, EventArgs e)
        {
            num = num += num0;
            textBox1.Text = num;
        }

        private void button11_Click(object sender, EventArgs e)
        {

        }

        private void button12_Click(object sender, EventArgs e)
        {

        }

        private void button13_Click(object sender, EventArgs e)
        {

        }
    }
}

試したこと

ボタンをそれぞれ増やしてテキストボックス1,2,3に割り振りすれば実現できるのですが、切り替えることはできるのか、
プロのみなさんはどういう風にプログラムを作っているのかという質問です。
実現する方法はいろんな方法があるのでしょうか。
初歩的な質問かと思いますがよろしくお願いします。

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

Microsoft Visual Studio Community 2019
Version 16.5.0
.NET Framework version 4.8.03752

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

(1) 切り替えボタンを、RadioButton にします。

見た目がボタンが良いなら Appearance プロパティを Button にするとトグルボタンになります。

「【C#】Windowsフォームでトグルボタンを実装する」
https://kuroeveryday.blogspot.com/2014/05/ToggleButton.html

すると Checked プロパティで、どれを選択したかがわかるのでプロパティを作っておきます。

private int SelectedIndex {
    get {
        if (radioButton1.Checked) return 1;
        if (radioButton2.Checked) return 2;
        if (radioButton3.Checked) return 3;
        return 0;
    }
}

(2) TextBox は List<TextBox> に積み上げておきます。

SelectedIndex が、インデックスとして使用できるよう、先頭に null を入れます。

    textBoxes = new List<TextBox> {
        null,
        textBox1,
        textBox2,
        textBox3
    };

(3) Button のイベントハンドラはひとつにまとめます。

button1.Click += Button_Click;
button2.Click += Button_Click;
button3.Click += Button_Click;
    ・
    ・
    ・

でもいいのですが、foreach でコントロールを列挙してひとまとめにします。

    foreach (var con in Controls) {
        if (con is Button button) {
            button.Click += Button_Click;
        }
    }

(4) Button_Click では、sender にクリックしたボタンが入ってくるので、それを利用します。

private void Button_Click(object sender, EventArgs e) {
    var btn = (Button)sender;
    ・
    ・
    ・
}

(5) というわけでこうなりました。

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace QA249299
{
    public partial class Form1 : Form
    {
        readonly List<TextBox> textBoxes;

        public Form1() {
            InitializeComponent();

            foreach (var con in Controls) {
                if (con is Button button) {
                    button.Click += Button_Click;
                }
            }

            textBoxes = new List<TextBox> {
                null,
                textBox1,
                textBox2,
                textBox3
            };
        }

        private void Button_Click(object sender, EventArgs e) {
            var textBox = textBoxes[SelectedIndex];
            if (textBox != null) {
                var btn = (Button)sender;
                textBox.Text += btn.Text;
            }
        }

        private int SelectedIndex {
            get {
                if (radioButton1.Checked) return 1;
                if (radioButton2.Checked) return 2;
                if (radioButton3.Checked) return 3;
                return 0;
            }
        }
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/25 22:45

    こんなにもコードがすっきりするとはほんとにすごいです。
    すごく勉強させていただきました。
    ありがとうございました。

    キャンセル

0

num += num1;

ってすればどうでしょう


切り替えるってはなしなら、切り替えボタンでTextboxの番号入れるようにして、
数字ボタンのイベントでその番号に応じたTextbox似代入すればよろしいかと。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

とりあえずソースを書いてみたけど、こんな感じでしょうか?

private TextBox outputTextBox = textBox1;

// ボタン1
private void button1_Click(object sender, EventArgs e)
        {
            outputTextBox.Text += "1";
        }

// テキストボックス1に切り替え
private void button11_Click(object sender, EventArgs e)
        {
            outputTextBox = textBox1;
        }

// テキストボックス2に切り替え
private void button12_Click(object sender, EventArgs e)
        {
            outputTextBox = textBox2;
        }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

提示コードでは各数字ボタン押下時の処理が,
textBox1.Text = num;
とされているから,当然,常にtextBox1.Textの内容が更新される.

更新対象を動的に切り替えたいなら,例えば,

  • 「今現在の更新対象はどれなのか?」という情報を保持するようにして
  • 更新対象切替ボタン押下時には,その情報を適切に変更するようにして
  • 各数字ボタン押下時の処理には,「今の現在の更新対象」のTextを更新するようにする

という感じでどうでしょうか.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/25 15:28

    (日本語を書いている間に,それそのままのコードが投下された)

    キャンセル

  • 2020/03/25 22:47

    回答ありがとうございます。
    現在の情報の保持も大切な要素ですね。
    参考にさせていただきます。
    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る