1

Forms.ListView から継承した独自の ListView クラスがあります。列の間の線をダブルクリックすると、列のサイズが変更され、列の項目がフル サイズで表示されます。

ただし、私にとってこれは正しく機能しません。一部の単語が部分的に隠されています。

私の理論では、これは項目のフォントが異なり、ListView がそれらすべてを見ていないため、一部の大きなフォント項目がまだ部分的に非表示になっているためです。

誰でもこの問題を解決できましたか (列間をダブルクリックしたときのイベントが見つからないようです)。そして、私の理論はもっともらしいですか?

よろしくお願いします

4

1 に答える 1

2

このコードを試すことができると思います。今書いてテストしたところ、うまくいきました。私のコンピューターでは、ColumnwidthChanging変更されたピクセルごとにイベントが発生し(マウスを使用して列のサイズを変更すると)、ダブルクリックすると2ピクセル以上変更されることに注意してください。リストに設定されているフォントを渡しています。特定の ListViewItem のフォントで行う必要があります。それを試してみて、それがうまくいくなら、それだけです。

        private void listView1_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)
        {
            ListView lv = (ListView)sender;
            int widthDifference = Math.Abs(lv.Columns[ e.ColumnIndex].Width - e.NewWidth);
            if( widthDifference>2)
            {
                int maxWidth = 0;
                Graphics g = lv.CreateGraphics();
                for(int i = 0;i<lv.Items.Count;i++) 
                {
                    string text = string.Empty;
                    if (e.ColumnIndex == 0)
                    {
                        text = lv.Items[i].Text;
                    }
                    else
                    {
                        text = lv.Items[i].SubItems[e.ColumnIndex - 1].Text;
                    }
                    SizeF sizeF = g.MeasureString(text, lv.Font);
                    if (maxWidth < (int)(sizeF.Width + 0.5))
                        maxWidth = (int)(sizeF.Width + 0.5);
                }
                g.Dispose();
                e.NewWidth = maxWidth;
            }
        }

編集:これらはListViewForm1.Designer.cs の私の設定です。これが役立つと思います:

 this.listView1.FullRowSelect = true;
 this.listView1.GridLines = true;
 this.listView1.Location = new System.Drawing.Point(253, 160);
 this.listView1.Name = "listView1";
 this.listView1.Size = new System.Drawing.Size(428, 97);
 this.listView1.TabIndex = 9;
 this.listView1.UseCompatibleStateImageBehavior = false;
 this.listView1.View = System.Windows.Forms.View.Details;
 this.listView1.ColumnWidthChanging += new System.Windows.Forms.ColumnWidthChangingEventHandler(this.listView1_ColumnWidthChanging);
于 2012-10-26T14:35:34.707 に答える