ListView
一部のサブアイテムの追加コンテンツを描画するためにオーナー描画を使用している があります。
この追加のコンテンツが追加のスペースを占有するため、リスト ビューが列の「自動サイズ変更」幅を誤って計算するようになりました。が小さすぎるようにサイズ変更され、そのリスト ビューのテキストは最後に括弧 (...) を付けてレンダリングされます。
リスト ビューで、自動サイズ変更中に列のサイズを確認するように求める方法はありますか?
ListView
一部のサブアイテムの追加コンテンツを描画するためにオーナー描画を使用している があります。
この追加のコンテンツが追加のスペースを占有するため、リスト ビューが列の「自動サイズ変更」幅を誤って計算するようになりました。が小さすぎるようにサイズ変更され、そのリスト ビューのテキストは最後に括弧 (...) を付けてレンダリングされます。
リスト ビューで、自動サイズ変更中に列のサイズを確認するように求める方法はありますか?
列のサイズが自動的に変更されようとしていることを通知する単一のメッセージはありません。しかし、あなたが述べたように、ユーザーがそれをトリガーできる方法は2つだけです。仕切りをダブルクリックする方法とCtrl-Shift-+
。これらの両方を傍受して、好きなことをすることができます。
ステップ1:ダブルクリックをインターセプトするには、サブクラス化して通知ListView
をリッスンする必要があります。HDN_DIVIDERDBLCLICK
protected override void WndProc(ref Message m) {
switch (m.Msg) {
case 0x4E: // WM_NOTIFY
if (!this.HandleNotify(ref m))
base.WndProc(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}
protected bool HandleNotify(ref Message m) {
const int HDN_DIVIDERDBLCLICKW = (HDN_FIRST - 25);
NativeMethods.NMHEADER nmheader = (NativeMethods.NMHEADER)m.GetLParam(typeof(NativeMethods.NMHEADER));
switch (nmheader.nhdr.code) {
case HDN_DIVIDERDBLCLICKW:
if (nmheader.iItem >= 0 && nmheader.iItem < this.Columns.Count) {
this.AutoResizeColumn(nmheader.iItem);
m.Result = (IntPtr)1; // prevent the change from happening
return true;
}
break;
default:
break;
}
return false;
}
もちろん、あなたはあなたが望むことをするために実装AutoResizeColumn()
しなければならないでしょう。
ステップ2。Ctrl-Shift- +をインターセプトするには、をオーバーライドする必要がありますProcessKeyPreview
。この記事では、その方法を説明します。オーバーライドではAutoResizeColumn()
、各列を呼び出します。
各サブアイテムが、所有者が描画するデータと同じ長さの「W」の文字列になるように作成した場合ListViewItems
、コントロールはそれらの文字列を使用して列thisを自動計算します。これはもっと簡単なアプローチかもしれません。
次の 2 つのシナリオでは、このように手動で行うことができます。
と を修正したい場合minimumWidth
はmaximumWidth
、
ColumnWidthChanging
次の場合にこれを使用しますListView
。
int minimumWidth = 200;
int maximumWidth = 500;
if (e.NewWidth maximumWidth)
{
e.Cancel = true;
e.NewWidth = maximumWidth;
}
の を固定したい場合はColumnWidth
、ListViewColumn
希望のColumnWidth
ColumnWidthChanging
次の場合にこれを使用しますListView
。
ListView ColumnList = sender as ListView;
e.Cancel = true;
e.NewWidth = ColumnList.Columns[e.ColumnIndex].Width;