いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

ADO.NET入門記-031 (DataTableにて文字列値の列を数値ソートする)


知り合いに聞かれたので、ついでにメモメモ。


DataTableを扱っていると、よくソート処理を行った結果を
UIなりデータベースなりに登録することがあります。

その際、列の値に数値が入っているんだけれども
列の型が文字列であることも、結構あったりします。
(本来数値列で定義しておくべきなのですが)


その際、良くとられる方法が以下の方法です。

数値列を新たに一個追加して、その列に値を移してソートする。


このやり方でも、うまくいくのですが列の値をいちいちコピーするのが面倒です。
で、列を追加するのは同じなのですが以下のようにすると多少楽です。

新たに列を追加する際に、Expressionを指定して列を定義する。


コードで表すと以下のような感じです。

table.Columns.Add("iCount", typeof(int), "Convert(origColumn, 'System.Int32')");


以下、サンプルコードです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            DataTable t = new DataTable();
            t.Columns.Add("Id", typeof(string));
            t.Columns.Add("Count", typeof(string));

            for (int i = 1000; i > 0; i--)
            {
                t.LoadDataRow(new object[] { i.ToString(), i.ToString() }, true);
            }

            gridControl1.DataSource = t;
            gridControl1.MainView.PopulateColumns();
        }

        private void simpleButton2_Click(object sender, EventArgs e)
        {
            DataTable t = gridControl1.DataSource as DataTable;

            // 新たに数値列を作成して追加.
            // その際、予めExpressionを指定して、列の値を自動算出させるようにする.
            t.Columns.Add("iCount", typeof(int), "Convert(Count, 'System.Int32')");
            t.DefaultView.Sort = "iCount ASC";

            gridControl1.RefreshDataSource();
        }
    }
}


実際に動作させると以下のようになります。

  • 初期状態(初期データとして1000件用意)
  • 普通に文字列カラムをソートした状態
  • 内部で数値列を追加して、それでソートした状態

================================
過去の記事については、以下のページからご参照下さい。