作り方をわすれそうな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());
}
}
}
}
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());
}
}
{
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());
}
}
{
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());
}
}
①をソートしたいカラムのインデックス、
②を通常のソート順から除外でソートしたい文字列で置換する