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

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

ただいまの
回答率

91.04%

  • C#

    5543questions

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

アクティブなコントロールとテキストボックスのバインド

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 173

kaisen

score 13

追記と注意書き。2017/12/26 Tue 18:07:23

バインドの問題について悩む人が、
この投稿内容について読む前に、
まず、この質問投稿の解決が
バインドの問題ではなくなってしまっていることを
お伝えしておきます。

これは、私がバインドという言葉を勘違いして使ってしまっていたせいです。
いまでもわかっていません。

それでも回答者様の回答の中には、
C#によるwindowsフォームのバインドについて
有用な情報があると思います。
回答者様の力のみによってこの投稿の価値が維持されているとおもいます。

しかし、質問内容がそもそもズレているので投稿については、
いずれ一部削除かあるいは全削除する可能性はあります。
そして私自身の投稿内容については、あてにしないでください。お騒がせしました。。

前提・実現したいこと

こんにちは。
C#でフォームを作成しているのですが、
データバインドで二日ほど詰まっています。
昨日質問を投稿し、回答をいただいて、
DataBindingsの構文については知ることができたので
エラーが出ることはなくなりました。
しかし、目的とする動作が達成できない状況は変わりませんでした。

実現したいことは、

現在アクティブなコントロールであるTextBox[A]にて、
テキスト入力中にEnterキーを押すことで、
あらたなTextBox[B]を生成する。

この生成時に、
public Directory Addによって、
TextBox[A]はTextBox[B]の親として登録される。

そうして
登録された情報をもとにして、
public static void LinkGraphによって、
フォーム上のtextboxすべての親子間に赤い線を描画する。

というような動作をする
フォームアプリを作ることです。

発生している問題の概要

TextBox[B]生成時点での
アクティブなコントロールをpublic Directory Addに引数として渡します。
そして、
全てのTextBoxの内(directory)から、アクティブなコントロールに一致するものを
TextBox[B]の親としてArrayListインスタンスsupnode内のsup要素とバインドさせます。
しかし、おそらくこのバインドに何かしらの問題があって、
描画時にsup.Top,sup.Leftの値が共に「0」になってしまっています。

該当のソースコード

///Directory.cs//textboxから継承したクラス
        public Directory Add(Directory sub, Directory supar, Control c)//subは新しく生成したtextbox,suparとcはアクティブなコントロール
        {
            int i = 0;
            Directory sup = new Directory("sup", Form1.k);
            foreach (Directory supe in directory)//directoryはstaticですべての新しく生成したtextboxを格納するArrayList
            {
                if (supe.Name == ((WindowsFormsApp1.Directory)c).Name)
                {
                    break;
                }
                i++;
            }
            directory.Add(sub);
            cop.Add(sub);//copはstaticで、directoryのバックアップのArrayList
            cont = (Control)cop[i];//contはDirectory.csのグローバルなコントロールインスタンス
            sup.DataBindings.Add(new Binding("Top", cont, "Top"));//contをソースにして、supのTopを変えたいのだけど、それができていない?
            sup.DataBindings.Add(new Binding("Left", cont, "Left"));
            sub.supnode.Add(sup);//supnodeは、subの親にあたるtextboxのArrayList
            con.Add(cont);//conはcontのバックアップのためのArrayList。contがGCされてしまうせいで、Topがバインドできていないのではないかと思ったときに追加した。
            return this;
        }
///Directory.cs//textboxから継承したクラス
        public static void LinkGraph()
        {
            Graphics f = Form1.ActiveForm.CreateGraphics();
            Graphics g = Form1.ActiveForm.CreateGraphics();

            // 背景色を更新
            f.Clear(color: SystemColors.Control);

            //penを作る
            Pen redPen = new Pen(Color.Red, 10);
            foreach (Directory sub in directory)
            {
                foreach (Directory sup in sub.supnode)//フォーム上にあるすべてのtextboxの親子関係を取得して、描画しているはず。
                {
                    //始点と終点
                    Point Start_point = new Point(sub.Left + sub.Width / 2, sub.Top + sub.Height / 2);
                    Point End_point = new Point(sup.Left + sup.Width / 2, sup.Top + sup.Height / 2);
                    //描画
                    g.DrawLine(redPen, Start_point, End_point);
                }
            }
            //penを解放
            redPen.Dispose();
        }

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

環境は、
visualstudio2017 C# windowsフォームアプリケーション
です。
C言語は自作でいくつかプログラムを書いたことがありますが、
データ構造あたりまでの学習しか進んでいません。
C#は初心者です。

作りながら学ぼうとしているので、頓珍漢なことばかりして
読みづらくしてしまっていると思います。

ぜひ
知恵をお貸しいただきたいです。
よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

バインドする方とされる方を逆にしてください。

コメントを受けて追記

Form1.cs

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


public delegate void tb_Click(object sender, KeyPressEventArgs e);

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public static int k = 0;
        public Directory temp = new Directory("tb", 0);
        public Form t = new Form();

        // tempを格納しておく動的リスト
        public static List<Directory> tempa = new List<Directory>();

        public Directory supar = new Directory("supar", k);

        public List<Point> spoint = new List<Point>();
        public List<Point> epoint = new List<Point>();

        private void button1_KeyPress(object sender, KeyPressEventArgs e)
        {

            if (e.KeyChar == (char)Keys.T)//Tキーが押されたとき
            {
                Control c = this.ActiveControl;
                Directory tb = new Directory("tb", k);
                tb.Add(tb, supar, c);
                tb.Multiline = true;
                tb.Top = 100;
                tb.Left = 100;
                tb.Height = 100;
                tb.Width = 100;
                tb.Text = "hello";
                this.Controls.Add(tb);
                tb.KeyDown += new KeyEventHandler(tb_KeyDown);
                tb.Focus();
                tb.BringToFront();
                temp = tb;
                supar = tb;
                this.Controls.Add(temp);
                tempa.Add(temp);
                e.Handled = true;
                k++;
            }
        }
        private void tb_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            Directory temp = new Directory("temp", k);

            Control d = this.ActiveControl;
            t.Width = d.Left;
            t.Height = d.Top;
            if (t.Width >= this.Width)
            {
                this.Width += 100;
            }
            if (t.Height >= this.Height)
            {
                this.Height += 100;
            }

            if (e.KeyCode == Keys.Enter)
            {
                if (e.Shift == true)
                {
                    this.SelectNextControl(this.ActiveControl, false, true, true, true);
                    e.Handled = true;
                    Control c = this.ActiveControl;
                    c.BringToFront();
                }
                else //メインの動作
                {
                    int th = 0;
                    int tw = 0;
                    Control c = this.ActiveControl;
                    th = c.Top + c.Height;
                    tw = c.Left + c.Width;
                    Directory tb = new Directory("tb", k);
                    tb.Add(tb, (TextBox)sender, c);
                    tb.Multiline = true;
                    tb.Top = th;
                    tb.Left = tw;
                    tb.Height = tb.HeightS(k);
                    tb.Width = 50;
                    tb.Text = "hello";
                    this.Controls.Add(tb);
                    tb.KeyDown += new KeyEventHandler(tb_KeyDown);
                    tb.Focus();
                    tb.BringToFront();
                    temp = tb;
                    supar = tb;
                    this.Controls.Add(temp);
                    tempa.Add(temp);
                    e.Handled = true;
                    k++;
                }
                if (e.Alt)
                {
                    e.Handled = true;
                }
            }
            if (e.Alt)
            {
                if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right)
                {
                    Directory.LinkGraph();
                }
                //移動
                if (e.KeyCode == Keys.Up)
                {
                    Control c = this.ActiveControl;
                    c.Top -= 5;
                    e.Handled = true;
                }
                if (e.KeyCode == Keys.Down)
                {
                    Control c = this.ActiveControl;
                    c.Top += 5;
                    e.Handled = true;
                }
                if (e.KeyCode == Keys.Left)
                {
                    Control c = this.ActiveControl;
                    c.Left -= 5;
                    e.Handled = true;
                }
                if (e.KeyCode == Keys.Right)
                {
                    Control c = this.ActiveControl;
                    c.Left += 5;
                    e.Handled = true;
                }

                if (e.Control)//移動
                {

                    if (e.KeyCode == Keys.Up)
                    {
                        Control c = this.ActiveControl;
                        c.Top -= 50;
                        e.Handled = true;
                    }
                    if (e.KeyCode == Keys.Down)
                    {
                        Control c = this.ActiveControl;
                        c.Top += 50;
                        e.Handled = true;
                    }
                    if (e.KeyCode == Keys.Left)
                    {
                        Control c = this.ActiveControl;
                        c.Left -= 50;
                        e.Handled = true;
                    }
                    if (e.KeyCode == Keys.Right)
                    {
                        Control c = this.ActiveControl;
                        c.Left += 50;
                        e.Handled = true;
                    }
                }
            }
            if (e.Control)
            {
                foreach (Control l in Controls)
                {
                    l.Top += 100;
                    l.Left += 100;
                }
            }
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
        }
    }
}

Directory.cs

using System.Collections;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp1
{

    public class Directory : Entry
    {
        public string name; // ディレクトリの名前
        public int num; //ディレクトリの識別番号
        private static ArrayList directory = new ArrayList(); // ディレクトリエントリの集合
        public new ArrayList supnode = new ArrayList();//子ノードの集合
        public static ArrayList _su = new ArrayList();
        public static ArrayList cop = new ArrayList();
        public static ArrayList con = new ArrayList();

        Directory cont;

        string supename = "";

        // 名前
        override public string Name
        {
            set { this.name = value; }
            get { return name; }
        }

        // サイズ
        override public int Size
        {
            get
            {
                int size = 0;
                foreach (Entry entry in directory)
                {
                    size += entry.Size;
                }
                return size;
            }
        }

        // コンストラクタ
        public Directory(string name, int k) : base(name, k)
        {
            string s = k.ToString("D");
            name = name + s;
            this.name = name;
            this.num = k;
        }

        // 追加
        public Directory Add(Directory sub, TextBox supar, Control c)
        {
            int i = 0;
            Directory su = new Directory("su", Form1.k);
            foreach (Directory supe in directory)
            {
                if (supe.Name == ((WindowsFormsApp1.Directory)c).Name)
                {
                    break;
                }
                i++;
            }
            directory.Add(sub);
            cop.Add(sub);
            cont = (Directory)cop[i];
            sub.supnode.Add(supar);
            con.Add(cont);
            return this;
        }

        public int HeightS(int k)
        {
            string nam;
            int h = 0;
            string s = k.ToString("D");
            nam = "tb" + s;
            foreach (Directory tbs in directory)
            {

                if (tbs.name == nam)
                {
                    h += 50;
                }
            }
            return h;
        }

        public static void LinkGraph()
        {
            Graphics f = Form1.ActiveForm.CreateGraphics();
            Graphics g = Form1.ActiveForm.CreateGraphics();

            //背景色を更新
            f.Clear(color: SystemColors.Control);

            //pen作成
            Pen redPen = new Pen(Color.Red, 10);
            foreach (Directory sub in directory)
            {
                foreach (TextBox sup in sub.supnode)
                {
                    //始点と終点
                    Point Start_point = new Point(sub.Left + sub.Width / 2, sub.Top + sub.Height / 2);
                    Point End_point = new Point(sup.Left + sup.Width / 2, sup.Top + sup.Height / 2);
                    //描画
                    g.DrawLine(redPen, Start_point, End_point);
                }
            }
            redPen.Dispose();
        }
    }
}

他にもまずいところは多くありますが、直していません。

一応説明通りに動くはずです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/26 11:53 編集

    Zuishinさん。お世話になっております。
    回答ありがとうございます。

    >バインドする方とされる方を逆にしてください。
    cont.DataBindings.Add(new Binding("Top", sup, "Top"));
    cont.DataBindings.Add(new Binding("Left",sup , "Left"));
    のようにしたところ、
    ””
    例外がスローされました: 'System.ArgumentException' (System.Windows.Forms.dll の中)
    型 'System.ArgumentException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました
    これにより、コレクション内の 2 つのバインドが同じプロパティにバインドされます。
    ””
    というエラーが出てしまいました。
    重ね重ね質問して申し訳ありません。
    どうすればうまくいくでしょうか?

    キャンセル

  • 2017/12/26 11:53

    双方向なので競合しているのかもしれません。
    BindingMode で OneWay を指定してみたらどうでしょうか?
    https://msdn.microsoft.com/ja-jp/library/system.windows.data.binding.mode(v=vs.110).aspx

    キャンセル

  • 2017/12/26 11:54

    回答ありがとうございます。
    試してきます。

    キャンセル

  • 2017/12/26 12:15 編集

    すこし、調べてきたのですが、
    WPFに関するBindingModeの設定の仕方の情報はたくさんあるみたいなのですが、
    Windowsフォームアプリケーションにおける設定の仕方が見当たりませんでした。

    OneWayの指定の方法についても、できれば教えていただきたいです。。お願いします。

    キャンセル

  • 2017/12/26 12:15

    リンクしましたが……
    コンストラクタで指定したいのであれば関連項目を読んでみてください。

    キャンセル

  • 2017/12/26 12:18

    すみません。リンク先を間違えました。
    https://msdn.microsoft.com/ja-jp/library/system.windows.forms.binding(v=vs.110).aspx
    こちらです。

    キャンセル

  • 2017/12/26 12:33

    回答ありがとうございます。
    新しいリンク先と、関連項目を調べました。
    どうやら、
    コンストラクタに方向を指定するためのパラメータはないように見えます。
    なにか、ほかに方法があるのでしょうか。。

    キャンセル

  • 2017/12/26 12:37

    WPF の Binding とごっちゃにしてしまったようです。

    このようにしてください。
    https://stackoverflow.com/questions/39129557/one-way-binding
    myForm.DataBindings.Add(new Binding("Items", ItemsController.Singleton, "Items")
    {
    DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged,
    ControlUpdateMode = ControlUpdateMode.Never
    });

    キャンセル

  • 2017/12/26 12:38

    回答ありがとうございます。
    さっそく試してきます。

    キャンセル

  • 2017/12/26 12:47

    試してきました。
    cont.DataBindings.Add(new Binding("Top", sup , "Top")
    {
    DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged,
    ControlUpdateMode = ControlUpdateMode.Never
    });
    cont.DataBindings.Add(new Binding("Left", sup, "Left")
    {
    DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged,
    ControlUpdateMode = ControlUpdateMode.Never
    });
    のようにしました。
    しかし、さきほどと同じ例外がでてしまいました。
    リンク先の方ではこれで解決しているようですが、
    なにか、変更の仕方がまずかったのでしょうか。。

    キャンセル

  • 2017/12/26 12:53

    DataSourceUpdateMode を Never に ControlUpdateMode を OnPropertyChanged にしてみたらどうですか?
    DataSource はバインドする側(sup)で Control はバインドされる側(cont)です。
    これにより sup のプロパティを変更しても cont のプロパティは変更されなくなります。
    しかし cont のプロパティを変更すると sup のプロパティは変更されます。

    キャンセル

  • 2017/12/26 12:56

    回答ありがとうございます。
    どうやら理解が追い付いてなかったみたいです。
    失礼しました。

    試してきます。

    キャンセル

  • 2017/12/26 13:03

    試してきました。
    cont.DataBindings.Add(new Binding("Top", sup , "Top")
    {
    DataSourceUpdateMode = DataSourceUpdateMode.Never,
    ControlUpdateMode = ControlUpdateMode.OnPropertyChanged
    });
    cont.DataBindings.Add(new Binding("Left", sup, "Left")
    {
    DataSourceUpdateMode = DataSourceUpdateMode.Never,
    ControlUpdateMode = ControlUpdateMode.OnPropertyChanged
    });
    に変更しました。
    同じ例外です。理解できたと思ったのですが。。

    キャンセル

  • 2017/12/26 13:06

    ダメでしたか。
    後で実際に試してから書きます。

    キャンセル

  • 2017/12/26 13:08

    とても助かります、ありがとうございます。

    キャンセル

  • 2017/12/26 13:23

    Form1.k, directory, cop, supnode などが未定義です。
    コンパイルの通るソースをお願いします。

    キャンセル

  • 2017/12/26 13:49

    わかりました。少々お待ちください。

    キャンセル

  • 2017/12/27 08:21 編集

    //program.cs
    編集削除済み。

    キャンセル

  • 2017/12/27 08:21 編集

    //Form1.cs
    編集削除済み。

    キャンセル

  • 2017/12/27 08:21 編集

    //Entry.cs
    編集削除済み。

    キャンセル

  • 2017/12/27 08:22 編集

    //Directory.cs
    編集削除済み。
    いずれも
    ひどいスパゲティソースでしたので。。17/12/27/8:00

    キャンセル

  • 2017/12/26 13:58

    以上になります。

    キャンセル

  • 2017/12/26 14:01

    どれを抜き出せばいいのか
    よくわからないので、
    ソースコードのすべてをコピペしてしまいました。

    キャンセル

  • 2017/12/26 16:49

    ちょっと言葉の確認をさせてください。
    Top と Left をバインドするとすべての Directory が同じ位置になってしまいますが、そうすると質問本文の意味と異なってきます。
    また親子関係についてもそうです。
    「バインド」「親子」の意味を確認しつつ質問を整理してもらえますか?

    現状では、テキストボックスで Enter を押すと、その右下に新たなテキストボックスができて「Hello」と表示されます。
    本来ならどうなる予定ですか?

    キャンセル

  • 2017/12/26 17:02 編集

    言葉についての整理は時間がかかりそうなので、少し待ってください。
    申し訳ありません。
    ただ、今達成しようとしている動作についてはお話しできます。

    テキストボックスでEnterを押して、新しいテキストボックスが生成されたら、
    その状態で、Alt+矢印キーを押してみてください。
    そうすると、フォーム左上に対して、そのテキストボックスから
    赤い線が伸びるはずです。
    その赤い線をフォーム左上ではなく、
    テキストボックスを生成する際にフォーカスがあった
    もう一つのテキストボックスから伸びるようにしたいです。

    キャンセル

  • 2017/12/26 17:02

    まず説明しやすそうなところから順番に書きます。
    親子関係についてですが、
    これは、テキストボックスを生成する際にフォーカスが当たっていたほうを
    親とし、フォーカスが移ったほうの新しいテキストボックスを子とします。

    キャンセル

  • 2017/12/26 17:18 編集

    1.Addメソッド時に取得したアクティブなContrlolを入れるための
    リストとして、DirectoryのグローバルにArrayListを作る.
    2.LinkGraphメソッドにおいて、
    そのリストをforeachをしようとする.
    3.失敗する.
    ので、
    LinkGraphのために、Controlの配列ではなく、
    そのControlのTop、LeftをバインドさせたArrayList.supnodeを
    作ろうと思ったことがきっかけで実装しようとしました。

    Arraylist.supnodeはstaticではないことと、
    Arraylist.directoryは逆にstaticであることによって、
    全てのDirectoryのTop,Leftが同じ位置になることはないと思います。

    キャンセル

  • 2017/12/26 17:18

    了解しました。バインドという言葉が私の思っていたものと違いました。
    言葉が共通していないとコミュニケーションが取れませんので、次回からは独自の用語は説明してください。
    回答を編集します。

    キャンセル

  • 2017/12/26 17:20

    失礼しました。。
    バインドという用語を私は間違っていたことにすら気づけず、
    恥ずかしい限りです。
    手間をかけさせてしまって申し訳ありません。

    キャンセル

  • 2017/12/26 17:30

    編集後のコードを実行しました。
    言葉足らずで失礼しました。。

    大変申し訳ないのですが、
    いくつかテキストボックスを生成した後に、
    shift+Enterキーで、一つ前に生成したテキストボックスAに戻って、
    Enterキーを入力していただいた後、
    生成されたテキストボックスBを動かしてみてもらえないでしょうか?
    このときに、生成されたテキストボックスBがテキストボックスAに
    対して、赤い線を伸ばすのが私の目標とする動作です。
    長々とお付き合いいただいて恐縮です。

    キャンセル

  • 2017/12/26 17:33

    最初にフォームに張り付けたのは TextBox です。
    Directory ではありません。
    これが親になれるように TextBox にキャストしています。
    これを Directory にしてソース中の TextBox にキャストしているところを Directory にすれば直るのではないかと思います。
    私はこれから出かけなければならないので見ておいてください。

    キャンセル

  • 2017/12/26 17:35

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

    はい、見ておきます。

    キャンセル

  • 2017/12/26 17:37

    あと、他に直さなければならないところは多くあると言いました。
    正直このスパゲッティソースを完全なものになるようメンテナンスする気にはなれません。
    最初から書き直したいくらいですが、そこまでする気もありません。
    やっつけで応急処置だけしました。

    当面質問された問題は解決したと思うので、他の問題についてはまた改めてください。

    キャンセル

  • 2017/12/26 18:02 編集

    ごめんなさい!
    焦っていて部分的にしか回答していただいたコードを取り込んいなかったようです。
    Zuishinさんにいただいたとおりのコードを丸々全部コピーして
    動かしたところ、
    まさに私がここ最近、ずっと取り組んでいた課題のうちでも
    核心的な部分が解決できているのを見ることができました!!

    すこし、目線が足元に向きすぎていたようです。
    Zuishin様、
    改めて、応答が拙くて申し訳ありませんでした。

    本当に助かりました、
    ありがとうございました!!!

    キャンセル

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

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

関連した質問

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

  • C#

    5543questions

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