PG日誌

受託系 PG が C# の事を書いています

ColumnWidthChangingイベントが発生しない

おかしい。どうして反応しないんだ。

ListViewのDetail表示で利用できるこのイベントは、ほぼ大半の利用シーンにおいてユーザーがカラムの幅を変更しようとする行為を妨害するために用いられる"邪悪なイベント"だ。ご多分に漏れず我らの陣営もこの方式を採用することになった。ユーザーの意図を妨害する邪悪な制御コードは以下の通りだ。

private void listView_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e) 
{
    e.Cancel = true; // ユーザーが幅を変更することをキャンセルする。
}

所が、問題が発生した。上記コードを組み込んだソフトウェアをWindowsServer2008R2で動かした所、イベントが発生しないのだ。調査のために以下の調査コードを埋め込んだ。

private void listView_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e) 
{
    // 調査用に新しく追加したコード --->
    using (var sw = new StreamWriter(@"d:\log.log")) 
    {
        sw.WriteLine(e.ColumnIndex); // Win2008R2だとログが出ない
    }
    // <---
    e.Cancel = true;
}

しかしログは出力されず、イベントが発生していない。

この現象は、テーマサービス等が無効な事が関係あるのだろうか?環境条件は変えられないので、このイベントに頼らない実装が必要そうだ。このような邪悪な実装は推奨されるべきではないが…。

根本的な問題として、2014年現在WindowsFormでデスクトップアプリを新規に作成する行為自体の是非を問う声が世間からかなり聞こえているがエンタープライズ用途だとそういった点の選択権がないので諦めるほかないのだが。WPFが使えるならそちらを使う方が望ましいという事か。