2010年03月26日

いちいち名前空間宣言しなくてもいいです

誰もが思いつくような小ネタを一つ。

System.Runtime.Serialization.DataContarctSerializer クラスは WCF 用に用意されたシリアライザですが、特徴の一つに、同一オブジェクトを参照としてシリアライズし、同じオブジェクトとしてデシリアライズすることが可能という機能があります。

続きを読む
posted by Hongliang at 19:47| Comment(0) | TrackBack(0) | C# | このブログの読者になる | 更新情報をチェックする

2010年01月08日

WPF 上の pack URI

Generic.xamlの中のImageのSourceを、相対パス指定する方法について で私が自分自身で触れたにも関わらず実際には良く理解していなかった pack スキームについての調査。

資料はコレ、Windows Presentation Foundation におけるパッケージの URI ですね。そのもととなる Open Packaging Conventions の仕様をまず見ろと言う話かも知れませんが、知りたいのはプログラム上の話ですし。

なお、Open Packaging Conventions の仕様は ISO/IEC 29500-2 Open Packaging Conventions (OPC, 2008)(zip ファイル)に存在しているみたいです。

続きを読む
posted by Hongliang at 21:51| Comment(0) | TrackBack(0) | .NET | このブログの読者になる | 更新情報をチェックする

2009年12月04日

メソッドの型引数を使った引数

今回のネタは Enumerableの拡張メソッドをGetMethodしたい から。

こういう拡張メソッドはどうでしょうか。Tuple<T1, T2> クラスはサンプルのために作った型引数を二つ取る適当なクラスなので、KeyValuePair<TKey, TValue> などで置き換えできます。ちなみに拡張メソッドにせず一部の Enumerale のメソッドを手で書けば .NET 2.0 以上で動くはずです。

続きを読む

posted by Hongliang at 20:29| Comment(3) | TrackBack(0) | C# | このブログの読者になる | 更新情報をチェックする

2008年07月05日

ジェネリックカレー

あんまり管理もしてない今日この頃ですが皆様いか(略)。

今回は型引数をバインドするカリー化ができないかと言う話。

一応解説しておくと、カリー化とは要するに引数の一部を固定した関数を作ることです。こんなサンプルコードでご理解いただけるでしょうか。

static int Add(int x, int y) { return x + y; }
static int Add5(int x) { return Add(x, 5); }
public static void Main() {
    Console.WriteLine(Add5(4));
}

この場合、Add メソッドの引数 y を 5 に固定した Add5 メソッドを新たに作成しています。まあサンプルのためのサンプルなんで意味は無いですけどね。ちなみに関数作成はラムダ式など使って表現することが多いです。

static void Main() {
    Func<int, int> addx = x => Add(x, 5);
    Console.WriteLine(addx(4));
}
' ちなみに VB だとラムダ式はこんな形になるそうな。
Public Shared Sub Main()
    Dim addx As Func(Of Integer, Integer) = Function(x) Add(x, 5)
    Console.WriteLine(addx(4))
End Sub
本題を読む
posted by Hongliang at 13:01| Comment(0) | TrackBack(0) | C# | このブログの読者になる | 更新情報をチェックする

2008年04月09日

二次元配列をもっとビュー 5

最終回の今回は検索機能を実装します。まあありきたりなことをするだけですが。

まず検索に使用する IBindingList のメンバを雛形から、また DataView のメンバもピックアップ。

bool IBindingList.SupportsSearching { get { return false; } }
void IBindingList.AddIndex(PropertyDescriptor property);
void IBindingList.RemoveIndex(PropertyDescriptor property);
int IBindingList.Find(PropertyDescriptor property, object key);
public int Find(object key);
public int Find(object[] key);
public DataRowView[] FindRows(object key);
public DataRowView[] FindRows(object[] key);

取り敢えず SupportsSearching は true 返すだけですね。

続きを読む
posted by Hongliang at 01:25| Comment(0) | TrackBack(0) | C# | このブログの読者になる | 更新情報をチェックする

2008年04月06日

二次元配列をもっとビュー 4

四回目。前回は Sort プロパティを設定したときに DataGridView などに通知する機構を追加しました。今回は要素が変更されたときの通知です。なお、面倒なので以降の記事では TwoDimensionalArrayView を ArrayView と、TwoDimensionalArrayRowView を ArrayRowView と書くことにします。

話しに入る前に、前回の終わりでちらっと触れた AllowEdit を書き換えておきましょう。これで DataGridView で表示しているときに値を編集できるようになります。まあ後からコードで AllowEdit を操作することもできるんですが、一般的には編集可能がデフォルトでしょうし。

// デフォルト値を変更
private bool allowEdit = true;

ListChangedEventArgs で利用される ListChangedType 列挙体には、リスト全体が変更となったことを表す Reset の他に、ItemAdded や ItemDeleted、ItemMoved などが存在しています。固定長である二次元配列には一見縁がなさそうですが、ListChanged イベントの対象となるリストは飽くまで ArrayView、つまり ArrayRowView の並び方が問題なのです。値を変更した結果 ArrayRowView の順序が変更されれば ItemMoved の ListChanged イベントを起こすさせる必要があります。また今回取り扱う予定はありませんが Filter(RowFilter)が適用されているとき(Filter を適用したタイミングでは Reset です)、そのフィルタから外れるように値が変更された場合は ItemDeleted の ListChanged を起こすことになります。

続きを読む
posted by Hongliang at 02:31| Comment(0) | TrackBack(0) | .NET | このブログの読者になる | 更新情報をチェックする

ここ(hongliang.seesaa.net)で公開しているものについて、利用は自由に行って頂いて構いません。改変、再頒布もお好きになさって下さい。利用に対しこちらが何かを要求することはありません。

ただし、公開するものを使用、または参考したことによって何らかの損害等が生じた場合でも、私はいかなる責任も負いません。

あ、こんなのに使ったってコメントを頂ければ嬉しいです。

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。