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

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

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

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

Q&A

解決済

1回答

2796閲覧

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

kaisen

総合スコア28

C#

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

0グッド

0クリップ

投稿2017/12/22 08:56

編集2017/12/22 09:04

###前提・実現したいこと
こんばんは。
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行目

###該当のソースコード

C#

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

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

C#

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

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

C#

1string message = null; 2if (true) { 3 message = "Hello World!"; 4} 5MessageBox.Show(message);

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

投稿2017/12/22 09:17

Zuishin

総合スコア28656

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

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

kaisen

2017/12/22 09:23

Zuishinさん 回答ありがとうございます。 グローバルに適当なDirectory型のインスタンスを作って、 そこに生成のたびに参照をコピーするようにしてみます。試してきます。
kaisen

2017/12/22 09:28

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問