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

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

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

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

Q&A

解決済

2回答

5979閲覧

例外がスローされました: 'System.ArgumentOutOfRangeException' (mscorlib.dll の中) 型 ~以下略

kaisen

総合スコア28

C#

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

0グッド

0クリップ

投稿2017/12/19 05:54

編集2017/12/19 05:56

###前提・実現したいこと
こんにちは。
C#でフォームアプリを作成中にタイトルのようなエラーが出ました。
後述するソースコード182~185行を追加したことで出ました。
例外のメッセージは184行からポップアップされています。

実現したいことは、

TextBoxにフォーカスがあるときに、
矢印キー上 を入力することで、
このTextBoxを上に移動する。

というような動作です。

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

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

例外がスローされました: 'System.ArgumentOutOfRangeException' (mscorlib.dll の中) 型 'System.ArgumentOutOfRangeException' のハンドルされていない例外が mscorlib.dll で発生しました インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません

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

C#

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

###試したこと
Keys.Upだけでなく、矢印キー全般で試してみましたが、同じエラーです。
また、clist[k].Topではなく、tb.Topなどに置き換えてみましたが、これもやはり意味なかったです。
一度、yをインクリメントしてから、そのyをclist[k].Topに代入してみましたが、これも無駄でした。

###補足情報(言語/FW/ツール等のバージョンなど)
環境は、
visualstudio2017 C# windowsフォームアプリケーション
です。
C言語は自作でいくつかプログラムを書いたことがありますが、
データ構造あたりまでの学習しか進んでいません。
C#は初心者です。

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

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

エラーになった時にkの値を確認してください。

clistにTextBoxを追加した時にkを加算しています。

C#

1clist.Add(tb); //1 2clist[k].Focus(); //2 3k++; //3 4clist[k].Top += 1; //4

1でclistに追加され、2の段階でclist[0]となります。
3でkが加算される為、clist[k]はclist[1]となり、clist[0]までしかないので
オーバーしてしまいます。
なので、4でclist[k]でアクセスしようとするとエラーが発生します。

投稿2017/12/19 06:13

YAmaGNZ

総合スコア10258

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

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

kaisen

2017/12/19 06:30

YAmaGNZさん。お世話になります。 >3でkが加算される為、clist[k]はclist[1]となり、clist[0]までしかないので >オーバーしてしまいます。 助かりました。 直してきます。
kaisen

2017/12/19 07:11 編集

YAmaGNZさん。 183: if (e.KeyCode == Keys.Up) 184: { 185: if (clist.Count <= k-1) 186: { 187: clist[k].Top -= 1; 188: e.Handled = true; 189: } 190: if(clist.Count > k-1) 191: { 192: clist[k-1].Top -= 1; 193: e.Handled = true; 194: } 195: } 以上のようにしたところ、動くようになりました。 ついでに、y座標に対する認識が間違っていたようなので、 フォームの座標系に合わせたものに変えました。
kaisen

2017/12/19 07:17

ちなみに、 この修正後のコードでは、  フォーカスが当たっているtextboxではなく、 生成された最新のtextboxがKey.Upの対象となるのですが、 いかにすれば、フォーカスが当たっているtextboxを動かせるでしょうか?
kaisen

2017/12/19 07:25

if (e.KeyCode == Keys.Up) { //if (clist.Count <= k-1) //{ // Control c = this.ActiveControl; // clist[k].Top -= 1; // e.Handled = true; //} //if(clist.Count > k-1) //{ // clist[k-1].Top -= 1; // e.Handled = true; //} Control c = this.ActiveControl; c.Top -= 1; e.Handled = true; } のようにしたところ、 「フォーカスが当たっているtextbox」を動かせました。 ありがとうございました!
guest

0

if ( clist.length > k) { clist[k].Top += 1; }

こんな感じで、
エラーが、配列の範囲外だって行っているのだから、
とりあえず、if文で、範囲内かチェックしよう。

投稿2017/12/19 05:59

kiichi54321

総合スコア1984

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

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

kaisen

2017/12/19 06:01

迅速な回答ありがとうございます。 直してきます。
kaisen

2017/12/19 06:10

kiichi54321さん。 ```C# 181: } 182: if (e.KeyCode == Keys.Up) 183: { 184: if (clist.Count > k) 185: { 186: clist[k].Top += 1; 187: } 188: } ``` のような感じで直してみました。 lengthとして、Countが使えると調べて分かったので使いました。 エラーもなく、ビルドして実行できるようになったのですが、 目的とする動作が実現できていません。 たとえば、clist[k].Top += 1;←こことか、 おかしいことしているんでしょうか?
kaisen

2017/12/19 06:47 編集

kiichi54321さん。ごめんなさい。 184: if (clist.Count > k) 185: { 186: clist[k].Top += 1; 187: } ではなく、 186行目で例外処理にすべきでした。 比較演算子を見間違えてしまう、初歩的なミスをしていました。 引き続き、コードを修正してきます。
kaisen

2017/12/19 07:12

kiichi54321さん。 183: if (e.KeyCode == Keys.Up) 184: { 185: if (clist.Count <= k-1) 186: { 187: clist[k].Top -= 1; 188: e.Handled = true; 189: } 190: if(clist.Count > k-1) 191: { 192: clist[k-1].Top -= 1; 193: e.Handled = true; 194: } 195: } 以上のようにしたところ、動くようになりました。 ついでに、y座標に対する認識が間違っていたようなので、 フォームの座標系に合わせたものに変えました。
kaisen

2017/12/19 07:17

ちなみに、 この修正後のコードでは、 フォーカスが当たっているtextboxではなく、 生成された最新のtextboxがKey.Upの対象となるのですが、 いかにすれば、フォーカスが当たっているtextboxを動かせるでしょうか?
kaisen

2017/12/19 07:25

if (e.KeyCode == Keys.Up) { //if (clist.Count <= k-1) //{ // Control c = this.ActiveControl; // clist[k].Top -= 1; // e.Handled = true; //} //if(clist.Count > k-1) //{ // clist[k-1].Top -= 1; // e.Handled = true; //} Control c = this.ActiveControl; c.Top -= 1; e.Handled = true; } ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問