DataGridViewのソート(IComparer)その2 特定の文字列は一番下にする | プログラミングがわからなすぎる

プログラミングがわからなすぎる

気が向いた時の備忘録。プログラミングは好きなのに物凄く単純なものしか理解できないからメモしていくうちに覚えられたらいいな
ターゲットフレームワークは大体4.7.2

テーマ:

作り方をわすれそうなIComparerをコピペで行きたい第二弾

今度は特定の文字列の場合のみ一番下とか一番上とか

普通のソート順を無視するサンプルを残していきたいと思います

 

 

動かすサンプル 

前回と同様、Formに設置したDataGridViewに入れたデータを

ソートしてみます

 

「普通の名前昇順ソート」ボタンは、クリックで名前列を昇順ソートさせます

この場合、名前列が空文字の行があるとソート順が一番上になる想定です

 

「空文字は下にするソート」ボタンは、クリックで名前列を昇順ソートしますが、名前が空文字の場合はソート順が下になるように作ります

 

 

 Form1.cs

using System;
using System.Collections;
using System.Windows.Forms;

namespace TestApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.Rows.Add("bird");
            dataGridView1.Rows.Add("rabbit");
            dataGridView1.Rows.Add("");
            dataGridView1.Rows.Add("cat");
            dataGridView1.Rows.Add("dog");

        }

        private void NameSort_Click(object sender, EventArgs e)
        {
            dataGridView1.Sort(dataGridView1.Columns[0], System.ComponentModel.ListSortDirection.Ascending);
        }

        private void CustomSort_Click(object sender, EventArgs e)
        {
            dataGridView1.Sort(new Compare());
        }

        class Compare : IComparer
        {
            int IComparer.Compare(object x, object y)
            {
                DataGridViewRow rowX = (DataGridViewRow)x;
                DataGridViewRow rowY = (DataGridViewRow)y;

                if (rowX.Cells[0].Value.ToString() == "")
                    return 1;
                if (rowY.Cells[0].Value.ToString() == "")
                    return -1;

                return rowX.Cells[0].Value.ToString().CompareTo(rowY.Cells[0].Value.ToString());
            }
        }

    }
}

Formの読み込み処理で名前列に文字列を追加していきます

 

「普通の名前昇順ソート」ボタンはクリックでNameSort_Clickメソッド、

「空文字は下にする」ボタンはCustomSort_Clickメソッドを呼び出します

 

IComparerを継承したCompareクラスでは

カラム0(名前列)の値が空文字の場合、他の値と比較せずソート順を返します

 

 

実行結果 

画面起動直後は上記のとおりです

Addした通り、ばらばらな順番で入ってます

 

「普通の名前昇順ソート」ボタンをクリックしてみると

名前列が昇順で並び変えられました

 

この場合は空文字が入っている行が一番上に来てしまいます

 

「空文字は下にするソート」ボタンをクリックしてみると

文字列がちゃんと設定されている行は昇順になっていますが

空文字を設定した行が一番下に来ています

 

 

メモ 

 

データグリッドビューを特定の文字列のみソート順をにしたいときのIComparer

class Compare : IComparer
{
    int IComparer.Compare(object x, object y)
    {
        DataGridViewRow rowX = (DataGridViewRow)x;
        DataGridViewRow rowY = (DataGridViewRow)y;

        if (rowX.Cells[①].Value.ToString() == "②")
            return 1;
        if (rowY.Cells[①].Value.ToString() == "②")
            return -1;

        return rowX.Cells[①].Value.ToString().CompareTo(rowY.Cells[①].Value.ToString());
    }
}

 

特定の文字列のみソート順をにしたいときのIComparer

class Compare : IComparer
{
    int IComparer.Compare(object x, object y)
    {
        DataGridViewRow rowX = (DataGridViewRow)x;
        DataGridViewRow rowY = (DataGridViewRow)y;

        if (rowX.Cells[①].Value.ToString() == "②")
            return -1;
        if (rowY.Cells[①].Value.ToString() == "②")
            return 1;

        return rowX.Cells[①].Value.ToString().CompareTo(rowY.Cells[①].Value.ToString());
    }
}

①をソートしたいカラムのインデックス、

②を通常のソート順から除外でソートしたい文字列で置換する