プロが教えるわが家の防犯対策術!

プログラムの勉強を始めたばかりのものです。
Visual Studio Community 2017 を使用して C# で Windows Form Application を勉強中です。

添付の図のようにForm上にListBoxを配置して、ユーザーがListBoxのアイテムを選択して「▲」「▼」ボタンを押すと、隣接しているアイテムと表示順(index)が入れ替わるようにしたいのですが、indexを書き換える記述方法が分からず悩んでいます。

例えば▲ボタンを押した際のイベントでは
頭の中では下記のような記述をイメージしたのですが
6行目で同じindexが2つになって例外が発生してしまうのかなと‥
そもそも6行目・7行目のようにindexを直接操作する記述が分かりません。

private void buttonUp_Click(object sender, EventArgs e)
{
int ia = listBox1.SelectedIndex;
int ib = listBox1.SelectedIndex -1;
if ( ib < 0 ) return;
listBox1のindex[listBox1.SelectedIndex -1] = listBox1のindex[ia];
listBox1のindex[ia] = listBox1のindex[ib];
}

こちらについて、何かアドバイスをいただけないでしょうか?
よろしくお願いします。m(_ _)m

「C# ListBoxのインデックスの値を」の質問画像

A 回答 (2件)

No.1です。



button2(DOWN)の方の
if (id >= listBox1.Items.Count - 1) return;

if ((id >= listBox1.Items.Count - 1) || (id == -1)) return;
に差し替えて下さい。
    • good
    • 0
この回答へのお礼

めぐみんさん、ご回答ありがとうございます!

こちら試してみて、やりたいことが実現できているのを確認しました!
なるほど、Index情報を格納しておいて、ListBoxのアイテムをクリアして再設定すれば良かったのですね。。
その発想に至らなかったので、目からうろこです。
アイテムはボタンを押せば追加したり削除したりできるようにするつもりなので
動的に要素数を変えられるということでListは丁度今勉強を始めたところでした。
とてもありがたいです。

こちら1つ1つじっくり理解を進めていきたいと思います。

お礼日時:2017/10/29 18:55

こちらでの検証用のコードです。


ボタン名は変わってますので気をつけて下さい。
(中身だけコピーして)

    private List<string> lst;

    private void Form1_Load(object sender, EventArgs e) // 検証用
    {
      listBox1.Items.AddRange(new string[] { "リスト1", "リスト2", "リスト3", "リスト4", "リスト5" });
    }

    private void button1_Click(object sender, EventArgs e) // UP
    {
      int id = listBox1.SelectedIndex;
      if (id <= 0) return;

      lst =new List<string>(listBox1.Items.Cast<string>().ToList());

      listBox1.Items.Clear();

      string st = lst[id - 1];
      lst.RemoveAt(id - 1);
      lst.Insert(id , st);

      listBox1.Items.AddRange(lst.ToArray());
    }

    private void button2_Click(object sender, EventArgs e) // DOWN
    {
      int id = listBox1.SelectedIndex;
      if (id >= listBox1.Items.Count - 1) return;

      lst = new List<string>(listBox1.Items.Cast<string>().ToList());

      listBox1.Items.Clear();

      string st = lst[id + 1];
      lst.RemoveAt(id + 1);
      lst.Insert(id, st);

      listBox1.Items.AddRange(lst.ToArray());
    }

LISTクラスに一旦アイテムを保管し、クリアしたリストボックスに再設定してます。
ご参考になれば良いですが。
    • good
    • 0
この回答へのお礼

お礼はNo.2の方に書かせていただいています。

お礼日時:2017/10/29 18:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています