【问题标题】:Resize when double clicking ListView doesnt work properly双击 ListView 时调整大小无法正常工作
【发布时间】:2012-10-29 15:34:36
【问题描述】:

我有自己的 ListView 类,继承自 Forms.ListView。双击列之间的线时,列会调整大小以全尺寸显示列项。

但是,对我来说,这不能正常工作 - 有些词被部分隐藏了。

我的理论是,这是由于项目具有不同的字体,并且 ListView 没有查看所有项目,导致一些较大的字体项目仍然部分隐藏。

任何人都解决了这个问题(在列之间双击时我似乎找不到任何事件)?我的理论可信吗?

最好的问候

【问题讨论】:

    标签: c# forms listview


    【解决方案1】:

    我认为您可以尝试使用此代码,我现在编写了它,经过测试,它对我有用。请注意,在我的计算机上ColumnwidthChanging 事件在每个像素更改时触发(当您使用鼠标调整列大小时)并且双击它会更改超过两个像素。我正在传递为列表设置的字体。您应该使用特定 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;
                }
            }
    

    编辑:这些是我在 Form1.Designer.cs 中的ListView 的设置,我认为这可以帮助你:

     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);
    

    【讨论】:

    • @drbaltar 你试过了吗?我很好奇它是否适用于您的特定情况。
    • 这看起来很有希望!但是,由于某种原因,该事件永远不会触发:S
    • 我还尝试启用“在拖动时显示窗口内容”,因为这似乎是触发事件所必需的,但似乎还不够。
    • @drbaltar 我在尝试代码时已经发布了 listView 中的设置。它工作得很好。您确定要设置问题的编辑中所示的事件吗?
    • 谢谢尼克!现在完美运行!
    猜你喜欢
    • 2012-05-16
    • 1970-01-01
    • 2023-03-16
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 2014-04-03
    相关资源
    最近更新 更多