加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在最小化具有自动调整列宽的列表视图后出现水平滚动条

发布时间:2020-12-15 22:08:02 所属栏目:百科 来源:网络整理
导读:我有ListView根据大小设置列的宽度: public class CommonListView : ListView{ protected override void OnResize(EventArgs e) { base.OnResize(e); int columnWidth = (ClientSize.Width - SystemInformation.VerticalScrollBarWidth - 6) / Columns.Coun
我有ListView根据大小设置列的宽度:

public class CommonListView : ListView
{
    protected override void OnResize(EventArgs e)
    {
        base.OnResize(e);

        int columnWidth = (ClientSize.Width - SystemInformation.VerticalScrollBarWidth - 6) / Columns.Count;
        foreach (ColumnHeader column in Columns)
            column.Width = columnWidth;
    }
}

我在表单上添加了listview,并将anchor属性设置为’All'(Top | Bottom | Left | Right).
当我更改表单的大小时,所有工作正常.但是当我最大化一个表单(通过最大化框)并最小化后,该列具有正确的大小,但出现水平滚动条不应该.

如果我点击它(不改变列或列表视图的大小),它将消失.

我该怎么做才能让这个滚动条出现?

解决方法

我找到的方法可以解决下面描述的问题.

private FormWindowState _previouseFormWindowState;

    private void MainForm_Resize(object sender,EventArgs e)
    {
        if (_previouseFormWindowState == FormWindowState.Maximized && WindowState != FormWindowState.Maximized)
        {
            var si = new SCROLLINFO();
            if (GetScrollInfo(listView,ref si,ScrollBarDirection.SB_HORZ))
            {
                if (si.nMax < si.nPage)
                {
                    ShowScrollBar(listView.Handle,(int)ScrollBarDirection.SB_HORZ,false);
                }
            }
        }
        _previouseFormWindowState = WindowState;
    }

    public enum ScrollInfoMask : uint
    {
        SIF_RANGE = 0x1,SIF_PAGE = 0x2,SIF_POS = 0x4,SIF_DISABLENOSCROLL = 0x8,SIF_TRACKPOS = 0x10,SIF_ALL = (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS),}

    public enum ScrollBarDirection
    {
        SB_HORZ = 0,SB_VERT = 1,SB_CTL = 2,SB_BOTH = 3
    }

    [Serializable,StructLayout(LayoutKind.Sequential)]
    public struct SCROLLINFO
    {
        public uint cbSize;
        public uint fMask;
        public int nMin;
        public int nMax;
        public uint nPage;
        public int nPos;
        public int nTrackPos;
    }

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool ShowScrollBar(IntPtr hWnd,int wBar,bool bShow);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetScrollInfo(IntPtr hwnd,int fnBar,ref SCROLLINFO lpsi);

    public static bool GetScrollInfo(Control ctrl,ref SCROLLINFO si,ScrollBarDirection scrollBarDirection)
    {
        if (ctrl != null)
        {
            si.cbSize = (uint)Marshal.SizeOf(si);
            si.fMask = (int)ScrollInfoMask.SIF_ALL;
            if (GetScrollInfo(ctrl.Handle,(int)scrollBarDirection,ref si))
                return true;
        }
        return false;
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读