知り合いに聞かれたので、ついでにメモメモ。
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(); } } }
実際に動作させると以下のようになります。
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ