環境:VisualStudioのFormアプリ.NET6.0
Formアプリを作成し、リストへの"追加""削除"の機能を搭載しています。
しかし、"削除"のコードを書いたものの何故か動作しません。
エラーメッセージの表示はない状況です。
原因についてご教示願えないでしょうか。コードに関しては以下の通りです。
よろしくお願いいたします。
リスト フィールド
C#
1 // string型のリストを宣言 2 List<string> list1 = new();
追加のコード
C#
1 private void button1_Click(object sender, EventArgs e) 2 { 3 // string型の変数pを取得 4 string p = textBox1.Text; 5 6 // 値がnullの場合 7 if (p == "") MessageBox.Show("文字を入力してください", "確認"); 8 9 // list1に入力された値を追加 10 else list1.Add(p); 11 12 textBox1.Clear(); 13 14 }
削除のコード
private void button3_Click(object sender, EventArgs e)
{
//labelの最後尾を削除
//ここが動作しません。
list1.RemoveAt(list1.Count -1 );
削除されていないことはどうやって確かめたんでしょうか?
失礼いたしました。
ボタン1と3の間に2があり、2をクリックすることで
ラベルにリストが反映されるアプリを作成いたしました。
ラベルに出力後、ボタン3をクリックすることで
ラベルの最後尾の要素が削除される作りにしたつもりだったのですが、
クリックをしても処理されず、VisualStudio上に以下の文言が表示されました。
ラベル内に表示されたリストから要素は削除される表示されたままでした。
System.ArgumentOutOfRangeException: 'Index was out of range. Must be non-negative and less than the size of the collection. Arg_ParamName_Name'
※ボタン2クリック時のコードは以下の通りです。
private void button2_Click(object sender, EventArgs e)
{
// label1にリストを出力
foreach (string i in list1)
{
label1.Text = string.Join(",", list1);
}
}
デバッガを使って list1 の中身がどうなっているのか調べましょう。ブレークポイントを button3_Click メソッドの中の
list1.RemoveAt(list1.Count -1 );
の行に置いてデバッグ実行し、button3 をクリックするとそこで止まります。その時の list1 の中身をチェックし、ステップ実行して次の行に進んでから再び list1 の中身をチェックして違いを見てください。
SurferOnWwwさま
ご指南ありがとうございます。デバック実行を行い動作を確認いたしました。
結果、Count-1は正しく動作しており、Form画面上で"削除"を押した際に、
出力されたリストを最新の状態にしていないことが問題でした。
label1.Text = string.Join(",", list1);
以上のコードを入力することで画面上でも正しく反映させることが出来ました。
> // label1にリストを出力
> foreach (string i in list1)
> {
> label1.Text = string.Join(",", list1);
> }
今回の件とは無関係ですが、ループは要りません。
foreach は除いて中身だけ一回実行してください。
ステップ実行する場合は、ウォッチ式に list1.Count を入れておくと、その時点での list1.Count が自動的に反映されるので便利です。
https://docs.microsoft.com/ja-jp/visualstudio/debugger/watch-and-quickwatch-windows?view=vs-2022
Zuishinさま
重ねてご教示いただきありがとうございます。
勉強不足を痛感するところです。
学ばせていただきます。
回答1件
あなたの回答
tips
プレビュー