###前提・実現したいこと
こんにちは。
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#は初心者です。
作りながら学ぼうとしているので、頓珍漢なことばかりして
読みづらくしてしまっていると思います。
知恵をお貸しいただきたければ幸いです。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/19 06:30
2017/12/19 07:11 編集
2017/12/19 07:17
2017/12/19 07:25