日期:2014-05-18  浏览次数:20708 次

关于ListView美化问题...
需求,无法上图抱歉只能描述了:
winform ListView ,公司需要风格好看,但是我找不到网上现成第三方的,所以只能自己重绘,但是遇到一些问题;
首先要是有朋友能提供现成的控件下载,我就不用再重绘了;
重绘中具体遇到的问题:
我需要 ColumnHeader,自定义的背景线条等,已经实现但是我发现,假如我的ListView.Width有300px;假如我的ColumnHeader合起来不足300px那么,表头哪一行除了ColumnHeader以外会是默认的白色...
我有两个思路...
1,能直接把那白色重绘成我想要的样子,但是我找完了ListView的事件与方法都没找到....
2, 将所有的ColumnHeader总宽度固定为ListView的Width(我就是在这么做),但是这么做一旦用户拖动ColumnHeader宽度也是不行的,于是我用了OnColumnWidthChanging,想实现的效果,如果拖动的是最后一列,就不改变;否则假如拖动的是某列,就让它后面那列也改变Width,但是这样的话,假如我移动第一列,第二列的宽度会先变,然后变第一列,所以一直抖动,
于是我在代码里手动先改变第一列的width,并且取消这次改变,结果....无限触发OnColumnWidthChanging
代码如下:
C# code

        int changeId=-1;
        protected override void OnColumnWidthChanging(ColumnWidthChangingEventArgs e)
        {
            if (changeId == -1 || e.ColumnIndex == changeId)
            {
                //如果是最后一列,禁止拖动
                if (this.Columns[e.ColumnIndex].DisplayIndex == this.Columns.Count - 1)
                {
                    e.NewWidth = this.Columns[e.ColumnIndex].Width;
                    e.Cancel = true;
                }
                else
                {
                    changeId = e.ColumnIndex;
                    //this.Columns[e.ColumnIndex].Width = e.NewWidth;
                    //e.NewWidth = this.Columns[e.ColumnIndex].Width;
                    //e.Cancel = true;
                    this.Columns[e.ColumnIndex + 1].Width -= (e.NewWidth - this.Columns[e.ColumnIndex].Width);                }
            }
            base.OnColumnWidthChanging(e);
        }
        protected override void OnColumnWidthChanged(ColumnWidthChangedEventArgs e)
        {
            if (e.ColumnIndex == changeId)
            {
                changeId = -1;
            }
            base.OnColumnWidthChanged(e);
        }


哪位对这些了解的大哥,帮帮忙吧,不一定要用重绘就算是第三方控件都没关系,我实在被搞惨了,下周就要搞定界面开始逻辑编码了,我界面做了一周了。。。。

------解决方案--------------------
你要不要试试列头放在 ListView 外面,用别的组合控件来显示