院長のメモ帖
2014年4月30日 水曜日
DataGridViewとBindingList<T>
.NETでデーターをいじるプログラミングをすると、DataGridViewは非常に便利なコントロールです。SQL ServerにLinqToSQLでクエリした結果をデーターバインドするだけでソート可能な表が作れるので、日常的に多用しています。
ただ、クエリ結果を演算してローカルのLinqToObjectで匿名型のIEnumerable<T>(具体的にはList<T>)に変換すると、表に表示はできますが、そのままではソートできなくなるのが不便に感じてました。DataSetやらで型情報を作ればいいのですが、せっかく匿名型で簡単にクエリーできるのに、表示のためだけに手間が多すぎて困ってました。
なんか方法があるはずだと思いながら長年ほかっておきましたが、検索したらカスタムデーターバインド(第2部)にやり方の概論が書いてありました。要するにはIBindingListインターフェースを実装するソート可能なジェネリッククラスを作ればいいということで、具体的にはBindingList<T>を継承した列挙クラスを作り、汎用ソートロジックを組み込んだIComparer<T>を継承したコンペアラークラスを作成し、IBindingListのソートメソッドをオーバーライドすればよいということでした。
サンプルソースがあったみたいなんですが、ダウンロードできず、HP上のコードは不完全なものだったので参考にしてSortableBindingList<T>を完成させました。コンストラクタでList<T>オブジェクトを受け取りIBindingListに変換し、IComparableな公開プロパティすべてを標準の序列でソートできます。IBindingListにはほかにも機能があるようですが、とりあえずソートできれば用が足りるので他の機能については実装しませんでしたが、とっても便利なクラスを作ることができました。
ただ、クエリ結果を演算してローカルのLinqToObjectで匿名型のIEnumerable<T>(具体的にはList<T>)に変換すると、表に表示はできますが、そのままではソートできなくなるのが不便に感じてました。DataSetやらで型情報を作ればいいのですが、せっかく匿名型で簡単にクエリーできるのに、表示のためだけに手間が多すぎて困ってました。
なんか方法があるはずだと思いながら長年ほかっておきましたが、検索したらカスタムデーターバインド(第2部)にやり方の概論が書いてありました。要するにはIBindingListインターフェースを実装するソート可能なジェネリッククラスを作ればいいということで、具体的にはBindingList<T>を継承した列挙クラスを作り、汎用ソートロジックを組み込んだIComparer<T>を継承したコンペアラークラスを作成し、IBindingListのソートメソッドをオーバーライドすればよいということでした。
サンプルソースがあったみたいなんですが、ダウンロードできず、HP上のコードは不完全なものだったので参考にしてSortableBindingList<T>を完成させました。コンストラクタでList<T>オブジェクトを受け取りIBindingListに変換し、IComparableな公開プロパティすべてを標準の序列でソートできます。IBindingListにはほかにも機能があるようですが、とりあえずソートできれば用が足りるので他の機能については実装しませんでしたが、とっても便利なクラスを作ることができました。
using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
using System.Data;
namespace mynamespace
{
//IBindingListのソート機能を実装したジェネリックリストクラス
public class SortableBindingList<T> : BindingList<T>
{
public static SortableBindingList<T> ToSortableBindingList(List<T> list)
{
return new SortableBindingList<T>(list);
}
public SortableBindingList(List<T> list) : base(list) { }
protected override bool SupportsSortingCore
{
get
{
return true;
}
}
protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
{
List<T> items = this.Items as List<T>;
if (items != null)
{
PropertyComparer<T> pc = new PropertyComparer<T>(prop, direction);
items.Sort(pc);
_isSorted = true;
}
else
_isSorted = false;
_direction = direction;
_SortProperty = prop;
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
private bool _isSorted;
protected override bool IsSortedCore
{
get { return _isSorted; }
}
private ListSortDirection _direction;
protected override ListSortDirection SortDirectionCore
{
get
{
return _direction;
}
}
private PropertyDescriptor _SortProperty;
protected override PropertyDescriptor SortPropertyCore
{
get
{
return _SortProperty;
}
}
}
//汎用コンペアラークラス
public class PropertyComparer<T> : IComparer<T>
{
public PropertyComparer(PropertyDescriptor propertyName, ListSortDirection direction)
{
this.name = propertyName;
sortDirection = (direction == ListSortDirection.Ascending) ? 1 : -1;
}
private PropertyDescriptor name;
private int sortDirection;
#region IComparer<T> メンバー
public int Compare(T x, T y)
{
IComparable left = name.GetValue(x) as IComparable;
IComparable right = name.GetValue(y) as IComparable;
int result;
if (left != null)
result = left.CompareTo(right);
else if (right == null)
result = 0;
else
result = -1;
return result * sortDirection;
}
//呼び出し用拡張メソッド
public static class BindingListExtensions
{
public static SortableBindingList<T> ToSortableBindingList<T>(this List<T> list)
{
return SortableBindingList<T>.ToSortableBindingList(list);
}
}
}
2014年4月 8日 火曜日
ブロードキャストアドレス
もうすぐ、XPのサポート切れということですが、うちにも1台だけ対象PCがあります。それは、電話番号通知システムに使っているCTIサーバーです。CTIソフトは自作で、はじめはVBで作っていたのを.NET4.0に書き直したので最新OSで問題なく動くのですが、ファイルバックアップソフトも入っていて、これはライセンスをバージョンアップしていないのでXPまでしか対応していないんです。うちで一番古いPCですが、大した故障しなかったのでずっとそのままにして、ファンだけ何回か取り替えましたが、この際新しくしてみました。
ところが、CTIソフトに不具合が出ました。電話番号を読み取ってSQLサーバーに記録するところは大丈夫なんですが、他のPCへの通知がうまくいきません。なんでだろうといじっていると、このPCはNICが二つあって一つは院内LANに、もう一つはフレッツ光の端末につなげてあったんですが、どうもフレッツ光端末にUDPをブロードキャストしているようでした。
いろいろ実験してみると、2つNICがあって255.255.255.255をSystem.Net.SocketのUdpClientクラスを使ってブロードキャストした場合、どちらか一つのNICでしかブロードキャストしてくれず、プログラム的にどちらかを指定することもできないようでした。
いろいろ調査してもよくわかりませんでしたが、ふと192.168.0.255でブロードキャストしたら、院内LANのNICでブロードキャストしてくれました。ハードコードなんでネットワークアドレスを変更したらソフトを書き換えなくちゃならないけど、たぶんそういうことはしないのでこれで良しということにしました。
ところが、CTIソフトに不具合が出ました。電話番号を読み取ってSQLサーバーに記録するところは大丈夫なんですが、他のPCへの通知がうまくいきません。なんでだろうといじっていると、このPCはNICが二つあって一つは院内LANに、もう一つはフレッツ光の端末につなげてあったんですが、どうもフレッツ光端末にUDPをブロードキャストしているようでした。
いろいろ実験してみると、2つNICがあって255.255.255.255をSystem.Net.SocketのUdpClientクラスを使ってブロードキャストした場合、どちらか一つのNICでしかブロードキャストしてくれず、プログラム的にどちらかを指定することもできないようでした。
いろいろ調査してもよくわかりませんでしたが、ふと192.168.0.255でブロードキャストしたら、院内LANのNICでブロードキャストしてくれました。ハードコードなんでネットワークアドレスを変更したらソフトを書き換えなくちゃならないけど、たぶんそういうことはしないのでこれで良しということにしました。
2014年3月10日 月曜日
FC岐阜対カターレ富山
開幕戦は、ほかの用事があっていけませんでしたが昨日の第2戦はサッカー観戦に行ってきました。
今年は岐阜のアブラモビッチ(Jトラスト)さんが、監督ラモスを筆頭に、川口や三都主といったサッカーをたいして知らない人でも知っているような人達をはじめ大量の補強をおこなって、もう去年までとまったく状況が変わったといっていいでしょう。
見逃したホーム開幕戦は一万一千人も観客が集まったとのことで開始2時間前に球場に行きましたが、結構集まっていました。のちの発表では7800人とのことで、初戦からはかなり減りましたが、コンスタントに7000人集まるようになればクラブ経営も軌道に乗るんじゃないでしょうか。
試合は、開始から20分ごろまでは富山が少しだけ押し気味に見えましたが、徐々にペースをつかんだ岐阜が先制。その後はがっちりペースをつかみなんと3-0で快勝。今までは1点2点のリードではハラハラしていましたが、今日は完ぺきなゲーム展開で落ち着いてみていることができました。
各選手よかったのですが、なかでも三都主の正確なロングパスは光っていました。日本代表にいたころはサイドアタッカーの印象が強かったですが、前線へのロングフィードが確実に味方の選手に届くパス能力は今まで在籍したどの選手をも凌駕する次元の違う正確さでした。
いままで、3得点見るためには5試合ぐらい足を運ぶ必要があったのが、たった2試合で6得点。開幕2連勝でチーム始まって以来の単独首位!
こんな素晴らしいチームに生まれ変わろうとしているFC岐阜ですが、この変化はサポーターの力ではなくアブラモビッチ氏が起こした変化です。本当に岐阜に根付くかどうか、今年は正念場です。こんな素晴らしいチームになっても観客が来ないようでは岐阜にサッカーチームはいらない、ということになります。僕もなるべく足を運んでチームの変化を見守りたいと思います。
今年は岐阜のアブラモビッチ(Jトラスト)さんが、監督ラモスを筆頭に、川口や三都主といったサッカーをたいして知らない人でも知っているような人達をはじめ大量の補強をおこなって、もう去年までとまったく状況が変わったといっていいでしょう。
見逃したホーム開幕戦は一万一千人も観客が集まったとのことで開始2時間前に球場に行きましたが、結構集まっていました。のちの発表では7800人とのことで、初戦からはかなり減りましたが、コンスタントに7000人集まるようになればクラブ経営も軌道に乗るんじゃないでしょうか。
試合は、開始から20分ごろまでは富山が少しだけ押し気味に見えましたが、徐々にペースをつかんだ岐阜が先制。その後はがっちりペースをつかみなんと3-0で快勝。今までは1点2点のリードではハラハラしていましたが、今日は完ぺきなゲーム展開で落ち着いてみていることができました。
各選手よかったのですが、なかでも三都主の正確なロングパスは光っていました。日本代表にいたころはサイドアタッカーの印象が強かったですが、前線へのロングフィードが確実に味方の選手に届くパス能力は今まで在籍したどの選手をも凌駕する次元の違う正確さでした。
いままで、3得点見るためには5試合ぐらい足を運ぶ必要があったのが、たった2試合で6得点。開幕2連勝でチーム始まって以来の単独首位!
こんな素晴らしいチームに生まれ変わろうとしているFC岐阜ですが、この変化はサポーターの力ではなくアブラモビッチ氏が起こした変化です。本当に岐阜に根付くかどうか、今年は正念場です。こんな素晴らしいチームになっても観客が来ないようでは岐阜にサッカーチームはいらない、ということになります。僕もなるべく足を運んでチームの変化を見守りたいと思います。
2014年3月 7日 金曜日
花粉アレルギー
十数年前から花粉アレルギーになっていますが、先週ぐらいから花粉が飛び始めくしゃみ、鼻水、目のかゆみといった症状が悪化しています。薬で完全に症状を抑えていますが、薬が切れたり、寝る前にのみ忘れると最悪です。最近はPM2.5の影響も大きいようで、黄砂が吹くといつもの薬では抑えられなくなって倍量を必要とします。あー、早く終わってほしい。
2014年1月16日 木曜日
なめこ栽培キット
かなり遅くなりましたが、あけましておめでとうございます。本年もよろしくお願いします。
アンドロイド端末を買って1か月。アプリをぼちぼちダウンロードして遊んでいますが、この年末年始に一番はまったのが、「なめこ栽培キット」です。
原木に肥料を与えるとかわいいなめこたちが生えてきて収穫するというだけのゲームですが、いろいろなレアなめこがあって今日何とかコンプリートできました。引き続いて「なめこ栽培キットDX」をプレイしています。
このゲーム、肥料を与えたあとしばらく待っているとかわいいなめこたちが続々生えてきます。端末の電源を切っていても育ってくれるのでちょっとした空き時間にやれるのが、僕のライフスタイルにぴったりでよいです。
このゲームはずいぶん前からあるようですが、最初に知ったのは本屋でかんながなめこの絵本を見つけたときです。いろいろななめこがずいぶんかわいらしい絵で登場していてとても気に入ったみたいだったので、試しにアプリをダウンロードしてみたら、親子ではまってしまいました。幼稚園から帰ってくるなり、「新しいなめこ生えた?」という質問が習慣になりました。朝眠そうな時も、「新しいなめこだよ」と呼びかけると、むくっと起き上がるのでとても重宝しています。
ゲームは無料でしたが、結局なめこ絵本やらシールやら風船やら関連グッズをクリスマスから正月にかけて買わされまくったので結構な出費になりました。
アンドロイド端末を買って1か月。アプリをぼちぼちダウンロードして遊んでいますが、この年末年始に一番はまったのが、「なめこ栽培キット」です。
原木に肥料を与えるとかわいいなめこたちが生えてきて収穫するというだけのゲームですが、いろいろなレアなめこがあって今日何とかコンプリートできました。引き続いて「なめこ栽培キットDX」をプレイしています。
このゲーム、肥料を与えたあとしばらく待っているとかわいいなめこたちが続々生えてきます。端末の電源を切っていても育ってくれるのでちょっとした空き時間にやれるのが、僕のライフスタイルにぴったりでよいです。
このゲームはずいぶん前からあるようですが、最初に知ったのは本屋でかんながなめこの絵本を見つけたときです。いろいろななめこがずいぶんかわいらしい絵で登場していてとても気に入ったみたいだったので、試しにアプリをダウンロードしてみたら、親子ではまってしまいました。幼稚園から帰ってくるなり、「新しいなめこ生えた?」という質問が習慣になりました。朝眠そうな時も、「新しいなめこだよ」と呼びかけると、むくっと起き上がるのでとても重宝しています。
ゲームは無料でしたが、結局なめこ絵本やらシールやら風船やら関連グッズをクリスマスから正月にかけて買わされまくったので結構な出費になりました。