|
分類:[.NET 全般]
C#のListViewで皆様にお聞きしたいことがあり質問させて頂きました。
開発環境は、
Visual Studio 2012
.NET Framework 4.5
です。
ListViewに3列追加しListViewの幅が変更された際に
2列目のみを引き延ばすものを作りました。
処理内容は、OnClientSizeChangedでClientSize.Widthと1列3列の固定幅から
2列目の幅を算出し設定するというものです。
リスト幅の動きは概ね理想通りだったのですが、
以下操作を行うとListViewのリサイズ等で描画更新されない状態になってしまう事が分かりました。
(また、リストアイテムをクリックするとその列は描画されるのですがアイテムの描画開始Y位置がおかしくなっています。)
1.縦スクロールバーが表示されるまで縮小する
2.スクロールバーのノブを下に移動
3.縦スクロールバーの表示が消えるまで拡大する
ListViewのコードを以下に記述いたします。
※実際に使用しているコードから問題発生部分を抜き取ったものになります。
実戦で使用しているコードでは、OwnerDrawをtrueにしており、OnDrawSubItem()で描画をしています。
問題発生手順を行うと、リサイズ時にOnDrawSubItem()に処理が来なくなるため、再描画されていないと判断して先ほど記述しました。
また、アイテムの描画開始Y位置がおかしいというのは、クリックしたときのOnDrawSubItem()でイベントデータの1列目item.BoundsがY=16で来るように
なってしまう事が分かったため、先ほど記述しました。
class MyListView : ListView
{
public const int COL_1_WIDTH = 30;
public const int COL_3_WIDTH = 75;
enum LISTVIEW_COL
{
COL1,
COL2,
COL3,
NUM
}
public MyListView() {
Dock = DockStyle.Fill;
HeaderStyle = ColumnHeaderStyle.None;
FullRowSelect = true;
HideSelection = false;
View = System.Windows.Forms.View.Details;
//ヘッダ追加
ColumnHeader column1 = new ColumnHeader();
ColumnHeader column2 = new ColumnHeader();
ColumnHeader column3 = new ColumnHeader();
ColumnHeader[] columnHeaders = { column1, column2, column3 };
this.Columns.AddRange( columnHeaders );
//ヘッダ幅追加
this.Columns[( int )LISTVIEW_COL.COL1].Width = COL_1_WIDTH; //1列固定
this.Columns[( int )LISTVIEW_COL.COL3].Width = COL_3_WIDTH; //3列固定
int width = ClientRectangle.Width;
for( int i = 0; i < Columns.Count; i++ ) {
if( i == ( int )LISTVIEW_COL.COL2 ) { continue; }
width -= Columns[i].Width;
}
//2列 リストビューの幅いっぱいになるように調節
this.Columns[( int )LISTVIEW_COL.COL2].Width = width;
//適当にアイテム追加
for( int i = 0; i < 10; i++ ) {
string[] strs = { "COL1", "COL2", "COL3" };
ListViewItem item = new ListViewItem( strs );
this.Items.Add( item );
}
}
protected override void OnClientSizeChanged( EventArgs e ) {
base.OnClientSizeChanged( e );
//2列の幅を調整
int width = ClientRectangle.Width;
for( int i = 0; i < Columns.Count; i++ ) {
if( i == ( int )LISTVIEW_COL.COL2 ) { continue; }
width -= Columns[i].Width;
}
Columns[( int )LISTVIEW_COL.COL2].Width = width;
}
}
何故このような現象が起きてしまうのか、どうしてもよくわからないため、
お詳しい方、ご教示ください。
また、お作法的にこんな処理をしてはいけない、こうするべき等のご指摘を頂けると幸いです。
|