[.Net Framework][C#] ListViewで列を自動リサイズする

カラム長を最低幅に自動調整

カラムの文字数や要素の文字数が表示できる最低限のサイズに自動調整するにはListViewの以下のメソッドを使います。

ListView#AutoResizeColumns(スタイル指定)
すべてのカラムに対して適用する。
AutoResizeColumn(カラムインデックス,スタイル指定)
特定のカラムに対して適用する。

提供されているスタイルは2種類です。

ColumnHeaderAutoResizeStyle.HeaderSize
列のヘッダ文字列が最低限表示できるサイズに自動調整する。
ColumnHeaderAutoResizeStyle.ColumnContent
現在の列に含まれる全ての要素(ヘッダ除く)が最低限表示できるサイズに自動調整する。

例:

listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
[/sharp]

<h2>カラム長を最大幅に自動調整</h2>

自動でリストの幅いっぱいのサイズまで埋めた長さに設定する方法は標準で提供されていませんが、
次のように実装することで実現できます。

[csharp]
using System.Windows.Forms;

class FillableListView: ListView
{
        public FillableListView():base(){
            this.ClientSizeChanged += (sender, args) =>
                handleFillColumn();
            // 利用例:最初の列を自動調整する。
            this.AutoFillColumn = 0;
        }

<pre><code>    private int _autoFillColumn = -1;
    /// &lt;summary&gt;
    /// リストの空列を補うよう自動調整を行うカラム番号(0~)。
    /// 負の値やカラム数を超える場合は調整を行わない。
    /// &lt;/summary&gt;
    public int AutoFillColumn
    {
        get { return this._autoFillColumn; }
        set
        {
            this._autoFillColumn = value;
            this.handleFillColumn();
        }
    }

    private void handleFillColumn()
    {
        System.Diagnostics.Debug.Print("fillcolumn:{0},{1}",this._autoFillColumn , this.Columns.Count);
            if (this._autoFillColumn &gt;= 0 &amp;&amp; this._autoFillColumn &lt; this.Columns.Count)
                fillColumnWidth(this, this._autoFillColumn);
    }
    /// &lt;summary&gt;
    /// リストビューの特定のカラム幅を余白を埋める幅に調整する。
    /// &lt;/summary&gt;
    /// &lt;param name="listView"&gt;&lt;/param&gt;
    /// &lt;param name="index"&gt;&lt;/param&gt;
    private static void fillColumnWidth(ListView listView, int index)
    {
        int width = listView.ClientRectangle.Width;
        for (int i = 0; i &lt; listView.Columns.Count; i++)
        {
            if (i == index) { continue; }
            width -= listView.Columns[i].Width;
        }
        listView.BeginUpdate();
        listView.Columns[index].Width = Math.Max(width, 0);
        listView.ResumeLayout(true);
        listView.EndUpdate();
    }
</code></pre>

}

実装時の要点

キモは次の3つ。

  • リサイズへの対応はClientSizeChangedイベントで更新する。
  • カラム長はListView#Widthでなくクライアント領域(listView.ClientRectangle.Width)で計算する。
  • ListView#BeginUpdate()からListView#EndUpdate()の間でリサイズ変更を適用する。

の3つです。
これを守っていればどのように実装しても大丈夫です。

最後に

今回は自前での実装を行いましたが、GPLライセンスで問題なければObjectListViewというライブラリを使うと幸せになるかもしれません。

WindowsマシンでUbuntu Linux をデュアルブートでインストール

既存のWindows環境を残しつつUbuntuを導入する場合、Ubuntu 公式の Windows インストーラ(Wubi)が便利です。
リンク先の「Run it with Windows」からダウンロードできます。
普通のWindowsプログラムのインストーラと同じようにインストールでき、アンインストール時も「プログラムの追加と削除」メニューから安全に削除できます。
 
– 参考:
WindowsXPでお手軽Ubuntu

Cygwinでも apt-get (apt-cyg) を使う

apt-cyg をインストールすることでパッケージインストールをCUIで行うことができるようになります。
 
apt-cyg プロジェクト
http://code.google.com/p/apt-cyg/
 
■インストール手順:

svn –force export http://apt-cyg.googlecode.com/svn/trunk/ /usr/local/bin/
chmod +x /usr/local/bin/apt-cyg

 

■使い方:

パッケージをインストールする。
apt-cyg install <package names>
 
パッケージを削除する。
apt-cyg remove <package names>
 
setup.ini を更新する。
apt-cyg update
 
インストールされているパッケージの一覧を表示する。
apt-cyg show
 
パターン(複数可)に一致するパッケージを探す。
apt-cyg find <pattern(s)>
 
パターン(複数可)に一致するパッケージの情報を表示する。
apt-cyg describe <pattern(s)>
 
指定したコマンドやファイルを含むパッケージを見つけ出す。
apt-cyg packageof <commands or files>

_except_handler4_common が msvcrt.dll から見つかりませんでした

ある日メッセンジャーを立ち上げようとしたところいきなり次の警告ダイアログが出るようになった。


———————–
MsnMsgr.Exe – エントリ ポイントが見つかりません


———————–
プロシージャ エントリ ポイント _except_handler4_common がダイナミック リンク ライブラリ msvcrt.dll から見つかりませんでした。


———————–

OKを押して閉じると問題なくそのまま利用でき, Firefox 3.5 を起動しようとしても同じダイアログがでる。支障がないとはいえ毎回ダイアログがでるのは鬱陶しいので調べてみたところ、Windows Vista 以降にしかないはずの dwmapi.dll が Windows XP 環境にあると発生するらしい。
 

C:\windows\system32\dwmapi.dll

を適当にリネームしたところダイアログが出なくなったのでそのまま削除して問題解決。
 
参考:
msvcrt.dll error message when starting Firefox 3.5

Windowsで「ファイル名を指定して実行」をランチャー化するカスタマイズ方法と起動コマンド一覧

http://it.kndb.jp/entry/show/id/146
 
4年くらい前から、この記事と同じようにファイル名を指定して実行(Windows+R)をランチャーとして使っています。
いちいちランチャーをインストールするより Windows の標準機能を使おうということで始めたもののこれが存外に便利。
「ファイル名を指定して実行」に慣れると Windows標準のコマンドも覚えられるし、引数対応のプログラムもフル活用できて一石二鳥、です。
 
既存のコマンドとかぶらないよう、自分ルールで頭に記号をつけたものをショートカットで作って使っています。
 
・ “+” から始まるものはディレクトリ(+bin でランチャー用ディレクトリ, +home でマイドキュメントなど)
・”@” から始まるものはプログラム短縮名(@f で firefox, @i で iexplorer(Internet Explorer), @e で Eclipse, @p で PuTTY, @n でテキストエディタ, @fz で FileZilla, @ooo で OpenOffice.org などなど)
 
とくにキーボード派にオススメです。おためしあれ。

Windows SID とユーザ名を名前解決(変換)する

Windows SID(S-1-5-21-〜などから始まる数字の羅列)を Windows のログイン名に相互変換するには、こちらで配布されているLookupSID(looksid.exe)が便利です。
 
使い方は次のとおりです。

ログイン名→SID
C:> LookSid /A tanaka
S-1-5-XX-XXXXXXXXXXXXXX-XXXXXXXXXXX-XXXXXXXXXXX-XXXX
SID→ログイン名
C:> LookSid /S S-1-5-XX-XXXXXXXXXXXXXX-XXXXXXXXXXX-XXXXXXXXXXX-XXXX
tanaka

 
参考:
うにょうにょ本舗(開発/配布元)

rsync – file has vanished

Cygwin 版 rsync を使っていると、日本語ファイル周りで

rsync: opendir “/cygdrive/c/path/to/source/フォルダ?” failed: No such file or directory (2)

とか

file has vanished: “/cygdrive/c/path/to/source/ファイル?.xls”

のようなエラーが出ることがあります。
 
これはファイル名の文字コード変換(Unicode < -> UTF8)に失敗しているために起こるエラーで、cygwin1.dll をこちらの UTF-8 Cygwinに差し替えれば直ります。
 
参考:
hebrew characters(samba.org: rsync user list)
UTF-8 Cygwin
日本語での Cygwin の仕様説明ページ。

インターネットにつながずに2台のマシンを無線通信する

無線LANでピアツーピア接続(アドホックモード)する方法(東芝 dynabook サポート)
XP/Vista なら標準でアドホック(P2P)接続できるのですね。
 
参考:
無線 LAN を使いこなしてトクする Windows XP – パソコン同士でつなぐ(Microsoft At Home マガジン)
 
WiPeer
XP/Vista 用のP2Pメッセンジャー。ファイル共有機能つきで、通信の暗号化アルゴリズムはWEPのみ。
 
アドホックで無線通信を可能にする『WiPeer』

Sandboxie – Windows 用サンドボックス実行環境

Sandboxie – http://www.sandboxie.com/
 
プログラムのハードディスクへの書き込みを仮想化してくれる簡易サンドボックス。
Windows XP/2003/Vista 対応。
 
使い方は公式サイトや参考サイトを参照してください。
 
Sandoboxie を使ってサンドボックス化して実行したプログラムはファイル/レジストリの読み込みは仮想領域内参照+なければ実際の情報参照で行い、書き込みは仮想領域内にしかできなくなります。追加書き込みにしても実環境からコピー後に仮想環境に追加になるのでファイルの改ざん対策として抜群の効果があります。また、実行したプログラムがどのファイルを作成/変更するかを調べるのにも便利です。
 
ちなみに仮想領域は c:\Sandbox\(Windowsユーザアカウント名)\(DefaultBoxなどサンドボックス名\ 内に作られます。drive が C: ドライブ、 D: ドライブなどハードディスク構成を仮想化した領域で、user が Application Data や Local Settings, デスクトップなどユーザーのホームディレクトリ内の情報として利用されます。
 
なお、 Sandboxie ではネットワーク通信はそのまま流れるため情報流出は防げませんので、サンドボックスだからといって Winny など P2P を実行しても大丈夫なんだ、とは決して思わないように。
サンドボックスフォルダを削除するだけで確実に駆除できるため、事後対応は楽ですが…。
 
参考:
ヤバげなファイルは「Sandboxie」の仮想領域で実行せよ(教えて君.net)