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

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

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

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

Q&A

解決済

1回答

388閲覧

List<T>クラスーリストの削除に関して

migio

総合スコア49

C#

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

0グッド

0クリップ

投稿2022/06/25 07:01

環境: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 );

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

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

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

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

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

Zuishin

2022/06/25 07:06

削除されていないことはどうやって確かめたんでしょうか?
migio

2022/06/25 07:11

失礼いたしました。 ボタン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); } }
退会済みユーザー

退会済みユーザー

2022/06/25 07:57 編集

デバッガを使って list1 の中身がどうなっているのか調べましょう。ブレークポイントを button3_Click メソッドの中の list1.RemoveAt(list1.Count -1 ); の行に置いてデバッグ実行し、button3 をクリックするとそこで止まります。その時の list1 の中身をチェックし、ステップ実行して次の行に進んでから再び list1 の中身をチェックして違いを見てください。
migio

2022/06/25 08:18

SurferOnWwwさま ご指南ありがとうございます。デバック実行を行い動作を確認いたしました。 結果、Count-1は正しく動作しており、Form画面上で"削除"を押した際に、 出力されたリストを最新の状態にしていないことが問題でした。 label1.Text = string.Join(",", list1); 以上のコードを入力することで画面上でも正しく反映させることが出来ました。
Zuishin

2022/06/25 08:25

> // 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
migio

2022/06/25 10:14

Zuishinさま 重ねてご教示いただきありがとうございます。 勉強不足を痛感するところです。 学ばせていただきます。
guest

回答1

0

自己解決

SurferOnWwwさま
ご指南ありがとうございます。デバック実行を行い動作を確認いたしました。
結果、Count-1は正しく動作しており、Form画面上で"削除"を押した際に、
出力されたリストを最新の状態にしていないことが問題でした。

label1.Text = string.Join(",", list1);

以上のコードを入力することで画面上でも正しく反映させることが出来ました。

投稿2022/06/25 08:19

migio

総合スコア49

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問