[.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というライブラリを使うと幸せになるかもしれません。

WineでInstall Mono 2.8 or greaterエラーになった時の対応方法

LinuxでWindowsアプリケーションを実行する必要があったためWineでの実行を試したところ、

$ wine foo.exe
wine: Install Mono 2.8 or greater for Windows to run .NET 4.0 applications. 

と言われてしまいました。wine 2.10 を入れてるのに。

Wine内で動くmonoライブラリのバージョンが古いのだろうと判断し、
winetricksを使って.Net Frameworkライブラリのdotnet40を
インストールしたら動くようになりました。

手順は以下のとおりです。 続きを読む WineでInstall Mono 2.8 or greaterエラーになった時の対応方法

Google Chrome が重いので対策

普段、ブラウザとしてGoogle Chromeを使っています。ですがバージョン12になったあたりからやたらと重くなってきました。確認環境はWindows XP, Windows Vista(いずれも32bit)です。

 

バージョンアップのせいだけでなく、Google+がリリースされた影響や、検索キーワード入力中に動的に検索を行うようになった影響もあるかもしれません。

 

大抵はタイムアウトしたりフリーズしても再読み込みをすれば直りますが、Googleマップの経路検索だけは何度やっても結果検索が出なくなったのには困った・・・

 

原因を調べたところ、どうやら chrome://flags の「GPU Accelerated Canvas 2D」機能が悪さをしているらしく、該当の機能を無効にして再駆動すると問題なく動くように。

 

chrome://flags の設定は試験運用版の機能のため、全てデフォルトでオフになっていますが、Chromeを使っていて不安定になった時は、拡張機能を見直すのももちろんですが、一度chrome://flagsにも余計な機能がオンになっていないかチェックしてみるといいかもしれませんね。

 

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 の仕様説明ページ。