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

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

ただいまの
回答率

90.49%

  • C#

    7136questions

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

CS0103.現在のコンテキストに 'tb' という名前は存在しません。

解決済

回答 1

投稿 編集

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

kaisen

score 15

前提・実現したいこと

こんばんは。
C#でフォームアプリを作成中に
タイトルのようなエラーが出ました。

実現したいことは、
「まず、
Buttonを選択中に「T」を押すことで、
tb.num = 0(tbインスタンスの識別番号)というメンバを持った
TextBoxクラスを継承したDirectoryクラスのインスタンス
を生成する。

tb.num = 0メンバを持ったDirectoryインスタンスにテキスト入力中に
「Ctrl」か「Enter」キーを入力することで、
あらたにtb1を生成する。

そのようにして生成されたDirectoryインスタンスはみな、
Directoryクラスに用意されたArrayList型directoryメンバに格納される。

DirectoryクラスのメソッドLinkGraphによって、
格納されたDirectoryインスタンスAと
識別番号+=1の値の識別番号を持ったDirectoryインスタンスBと、を
線描画によって赤い線で結ぶ。
これをすべてのDirectoryインスタンスに対して行う。

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

以下、
エラー内容と、それが出たソースコードを記載します。

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

CS0103 現在のコンテキストに 'tb' という名前は存在しません。 132行目

該当のソースコード

本文の文字数制限を超えてしまったため、Directory.csとEntry.csの内容は、返信などで
追記したいと思います。
//Form1.cs
   1:using System.Collections.Generic;
   2:using System.Drawing;
   3:using System.Windows.Forms;
   4:
   5:
   6:public delegate void tb_Click(object sender, KeyPressEventArgs e);
   7:
   8:namespace WindowsFormsApp1
   9:{
  10:    public partial class Form1 : Form
  11:    {
  12:        public Form1()
  13:        {
  14:            InitializeComponent();
  15:        }
  16:
  17:
  18:        // ボタンのY座標
  19:        int y = 50;
  20:        int x = 50;
  21:
  22:        //動的リストの要素の添字として使うカウンタ
  23:        int i = 0;
  24:        int k = 0;
  25:
  26:
  27:        // ボタンを格納しておく動的リスト
  28:        List<Button> buttons = new List<Button>();
  29:        // テキストボックスを格納しておく動的リスト
  30:        List<Directory> clist = new List<Directory>();
  31:
  32:
  33:        private void button1_KeyPress(object sender, KeyPressEventArgs e)
  34:        {
  35:            //if (e.KeyChar == 49)//1が押されたとき
  36:
  37:            if (e.KeyChar == (char)Keys.R)//Rキーが押されたとき
  38:            {
  39:                // ボタンObjectを作成
  40:                Button myButton = new Button();
  41:
  42:                //myButton.Text = Console.ReadLine();
  43:
  44:                // ボタン同士が重ならないよう、位置をすこしずらす
  45:                x = x + 24;
  46:
  47:                // ボタン位置を設定
  48:                myButton.Location = new Point(x, y);
  49:
  50:                // ボタンを追加
  51:                this.Controls.Add(myButton);
  52:
  53:                // ボタンだけを集めた動的リストに今作ったボタンを追加
  54:                buttons.Add(myButton);
  55:
  56:                i++;
  57:                e.Handled = true;
  58:            }
  59:            if (e.KeyChar == (char)Keys.T)//Tキーが押されたとき
  60:            {
  61:                Directory tb = new Directory("tb", k);
  62:                tb.Add(tb);
  63:                string s = k.ToString("D");
  64:                string names = "tb";
  65:                names = names + s;
  66:                tb.name = names;
  67:                tb.Multiline = true;
  68:                Control c = this.ActiveControl;
  69:                this.Controls.Add(tb);
  70:                tb.Top = c.Top + c.Height;
  71:                tb.Left = c.Left + c.Width;
  72:                tb.Height = tb.HeightS(k);
  73:                tb.Width = c.Width;
  74:                tb.Text = "hello";
  75:                tb.KeyDown += new KeyEventHandler(tb_KeyDown);
  76:
  77:                tb.Focus();
  78:                tb.BringToFront();
  79:                e.Handled = true;
  80:                k++;
  81:            }
  82:        }
  83:        private void tb_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
  84:        {
  85:
  86:            if (e.KeyCode == Keys.Enter)
  87:            {
  88:                if (e.Shift == true)
  89:                {
  90:                    this.SelectNextControl(this.ActiveControl, false, true, true, true);
  91:                    e.Handled = true;
  92:                    Control c = this.ActiveControl;
  93:                    c.BringToFront();
  94:                }
  95:                else
  96:                {
  97:                    int th = 0;
  98:                    int tw = 0;
  99:                    Control c = this.ActiveControl;
 100:                    th = c.Top + c.Height;
 101:                    tw = c.Left + c.Width;
 102:                    Directory tb = new Directory("tb", k);
 103:                    tb.Add(tb);
 104:                    string s = k.ToString("D");
 105:                    string names = "tb";
 106:                    names = names + s;
 107:                    tb.name = names;
 108:                    tb.Multiline = true;
 109:                    Control c0 = this.ActiveControl;
 110:                    this.Controls.Add(tb);
 111:                    tb.Top = th;
 112:                    tb.Left = tw;
 113:                    tb.Height = tb.HeightS(k);
 114:                    tb.Width = 50;
 115:                    tb.Text = "hello";
 116:                    tb.KeyDown += new KeyEventHandler(tb_KeyDown);
 117:
 118:                    tb.Focus();
 119:                    tb.BringToFront();
 120:                    e.Handled = true;
 121:                    k++;
 122:                }
 123:                if (e.Alt)
 124:                {
 125:                    e.Handled = true;
 126:                }
 127:            }
 128:            if (e.Alt)
 129:            {
 130:                if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right)
 131:                {
 132:                    Directory.LinkGraph(ref tb);
 133:                }
 134:
 135:                if (e.KeyCode == Keys.Up)
 136:                {
 137:                    Control c = this.ActiveControl;
 138:                    c.Top -= 5;
 139:                    e.Handled = true;
 140:                }
 141:                if (e.KeyCode == Keys.Down)
 142:                {
 143:                    Control c = this.ActiveControl;
 144:                    c.Top += 5;
 145:                    e.Handled = true;
 146:                }
 147:                if (e.KeyCode == Keys.Left)
 148:                {
 149:                    Control c = this.ActiveControl;
 150:                    c.Left -= 5;
 151:                    e.Handled = true;
 152:                }
 153:                if (e.KeyCode == Keys.Right)
 154:                {
 155:                    Control c = this.ActiveControl;
 156:                    c.Left += 5;
 157:                    e.Handled = true;
 158:                }
 159:            }
 160:            if (e.Control)
 161:            {
 162:                int th = 50;
 163:                int tw = 50;
 164:                Directory tb = new Directory("tb", k);
 165:                tb.Add(tb);
 166:                string s = k.ToString("D");
 167:                string names = "tb";
 168:                names = names + s;
 169:                tb.name = names;
 170:                tb.Multiline = true;
 171:                Control c = this.ActiveControl;
 172:                this.Controls.Add(tb);
 173:                tb.Top = c.Top + th;
 174:                tb.Left = c.Left + tw;
 175:                tb.Height = tb.HeightS(k);
 176:                tb.Width = tw;
 177:                tb.Text = "hello";
 178:                tb.KeyDown += new KeyEventHandler(tb_KeyDown);
 179:
 180:                tb.Focus();
 181:                tb.BringToFront();
 182:                e.Handled = true;
 183:                k++;
 184:            }
 185:        }
 186:    }
 187:}

試したこと

Form1.csの
132行目を、
Control c = this.ActiveControl;
Directory.LinkGraph(ref c);
として、
Directory.csのLinkGraphメソッドの仮引数の型を
Control型にして
Directory tbcrnt = new Directry("tb",0);
tbcrnt = c;
等を書き加えましたが、当然、Control型のインスタンスの参照を
Directory型のインスタンスにすることはできませんでした。
ほかにも、ごちゃごちゃやってます。

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

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

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

知恵をお貸しいただきたければ幸いです。
よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

if (true) {
  string message = "Hello World!";
}
MessageBox.Show(message);

上のコードを見てください。
これは成功すると思いますか?
残念ながら失敗します。
message という変数が定義されているのが if ブロックの中なので、その外のスコープから見えないからです。
次のようにしたら成功します。

string message = null;
if (true) {
  message = "Hello World!";
}
MessageBox.Show(message);

スコープについて調べてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/22 18:23

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

    グローバルに適当なDirectory型のインスタンスを作って、
    そこに生成のたびに参照をコピーするようにしてみます。試してきます。

    キャンセル

  • 2017/12/22 18:28

    16行目のあたりに
    Directory temp = new Directory("temp", 0);
    を書き加え、
    生成を行っているあたりの最後の方に、
    temp = tb;
    と追記し、
    132行目を
    temp.LinkGraph(ref temp);
    と変更したところ、エラーは消えて、見事に動作しました。

    ありがとうございました。助かりました。

    キャンセル

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

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

関連した質問

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

  • C#

    7136questions

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