C#
snippet
ListView

[C#] リストビューの詳細表示(View=Details)時に、上ボタン/下ボタンクリックで、リスト項目を上下に移動

More than 1 year has passed since last update.
//コントロール名
//  ListView ... listView1
//  上ボタン ... buttonUp
//  下ボタン ... buttonDown

//コントロールの有効無効
private void ctrlEnable()
{
    //ListViewの選択綱目のIDを取得
    int sel_id = this.getListViewSelectedIndex();

    //未選択?
    if (sel_id < 0)
    {
        //ボタン無効
        this.buttonUp.Enabled = false;
        this.buttonDown.Enabled = false;
    }
    else
    {
        //0番以外は、UPボタン有効
        this.buttonUp.Enabled = (sel_id > 0);
        //末尾以外は、DOWNボタン有効
        this.buttonDown.Enabled = (sel_id < this.listView1.Items.Count - 1);
    }
}

//ListViewの選択綱目のIDを取得
private int getListViewSelectedIndex()
{
    if (this.listView1.SelectedIndices == null || this.listView1.SelectedIndices.Count == 0)
    {
        return -1;
    }
    else
    {
        return this.listView1.SelectedIndices[0];
    }
}

//ListViewの SelectedIndexChanged イベントハンドラ
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    //コントロールの有効無効
    this.ctrlEnable();
}

//UPボタンの Click イベントハンドラ
private void buttonUp_Click(object sender, EventArgs e)
{
    //マイナス方向に項目移動
    this.listViewItemUpDown(-1);
}

//DOWNボタンの Click イベントハンドラ
private void buttonDown_Click(object sender, EventArgs e)
{
    //マイナス方向に項目移動
    this.listViewItemUpDown(1);
}

//ListViewの項目移動
//引数
//  direction ... 移動方向(マイナス方向=-1、プラス方向=1)
private void listViewItemUpDown(int direction)
{
    //ListViewの選択綱目のIDを取得
    int sel_id = this.getListViewSelectedIndex();
    //未選択?
    if (sel_id < 0) return;

    //マイナス方向移動?
    if (direction < 0)
    {
        //0番は移動できない
        if (sel_id <= 0) return;
        //
        direction = -1;
    }
    //プラス方向
    else
    {
        //末尾は移動できない
        if (sel_id >= this.listView1.Items.Count - 1) return;
        //
        direction = 1;
    }

    //ListView更新開始
    this.listView1.BeginUpdate();

    //移動する項目
    ListViewItem item = this.listView1.Items[sel_id];
    //移動する項目を削除
    this.listView1.Items.RemoveAt(sel_id);
    //移動する項目をずらして挿入
    this.listView1.Items.Insert(sel_id + direction, item);

    //ListView更新終了
    this.listView1.EndUpdate();
}