C# ListView-将垂直网格线与标题分隔符对齐-使最后一列填充空间

C# ListView-将垂直网格线与标题分隔符对齐-使最后一列填充空间,c#,winforms,listview,C#,Winforms,Listview,我正在尝试用C#编写一个Windows窗体MusicLayer应用程序 应用程序应该显示一个列表,并有一些播放/停止按钮 我半小时前刚开始,但我的设计几乎完成了。现在我有三件事要解决。一个bug和两个好看的东西: 在这张照片上你可以看到我发现的虫子。你可能会说那没什么,但它很吸引人。我怎样才能解决这个问题 如何在不使内容居中的情况下使专栏标题居中 如何使最后一列填写listView的其余部分 您可以设置除第一列标题之外的所有列的TextAlign;它总是左对齐的。若要更改,您需要绘制它 没有

我正在尝试用C#编写一个Windows窗体MusicLayer应用程序

应用程序应该显示一个列表,并有一些播放/停止按钮

我半小时前刚开始,但我的设计几乎完成了。现在我有三件事要解决。一个bug和两个好看的东西:

  • 在这张照片上你可以看到我发现的虫子。你可能会说那没什么,但它很吸引人。我怎样才能解决这个问题

  • 如何在不使内容居中的情况下使专栏标题居中

  • 如何使最后一列填写listView的其余部分

    • 您可以设置除第一列标题之外的所有列的
      TextAlign
      ;它总是左对齐的。若要更改,您需要绘制它

    • 没有自动填充选项,因此您需要编写一个
      setColumnwidth
      函数,该函数循环所有列(最后一列除外),并对其
      宽度进行求和
      ;然后从ListView的
      Clientsize.Width
      中减去总和,并设置最后一列的宽度

    • 网格线中的显示错误对我来说是新的;到目前为止,我不知道如何修复它;也许业主图纸也会有帮助

    更新:

    下面是一些代码:

    void setLastColumnTofill(ListView lv)
    {
         int sum = 0;
         int count  = lv.Columns.Count;
         for (int i = 0; i < count   - 1; i++) sum += lv.Columns[i].Width;
         lv.Columns[count   - 1].Width = lv.ClientSize.Width - sum;
    }
    
    你可能想在颜色或宽度上玩一玩

    如果您有一个包含用于显示排序顺序(或其他内容)的图像的ImageList,您也可以添加此项来绘制它们:

     ColumnHeader colH = listView1.Columns[e.ColumnIndex];
     int ii = colH.ImageIndex;
     if (ii >= 0 && ii < imageList1.Images.Count) 
                e.Graphics.DrawImage(imageList1.Images[ii], 
                  e.Bounds.Width + e.Bounds.X - imageList1.ImageSize.Width, 0);
    
    ColumnHeader colH=listView1.Columns[e.ColumnIndex];
    int ii=colH.ImageIndex;
    如果(ii>=0&&ii

    OwnerDraw
    设置为
    true
    后,您可以执行以下操作:

    绘制列表视图

    int sortIndex = 0;
    private void listView1_DrawColumnHeader(object sender,
       DrawListViewColumnHeaderEventArgs e)
    {
        var state = e.State == ListViewItemStates.Selected ?
            VisualStyleElement.Header.Item.Hot : VisualStyleElement.Header.Item.Normal;
        var sortOrder = listView1.Sorting == SortOrder.Ascending ?
            VisualStyleElement.Header.SortArrow.SortedUp :
            VisualStyleElement.Header.SortArrow.SortedDown;
        var itemRenderer = new VisualStyleRenderer(state);
        var sortRenderer = new VisualStyleRenderer(sortOrder);
        var r = e.Bounds; 
        r.X += 1;
        itemRenderer.DrawBackground(e.Graphics, r);
        r.Inflate(-2, 0);
        var flags = TextFormatFlags.Left | TextFormatFlags.VerticalCenter |
            TextFormatFlags.SingleLine;
        itemRenderer.DrawText(e.Graphics, r, e.Header.Text, false, flags);
        var d = SystemInformation.VerticalScrollBarWidth;
        if (e.ColumnIndex == sortIndex) //Sorted Column
            sortRenderer.DrawBackground(e.Graphics, 
                new Rectangle(r.Right - d, r.Top, d, r.Height));
    }
    
    private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
    {
        e.DrawDefault = true;  /*Use default rendering*/
    }
    
    private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
    {
        e.DrawDefault = true;  /*Use default rendering*/
    }
    
    使用最后一列填充列表视图

    private void ListViewSample_Load(object sender, EventArgs e)
    {
        var otherItemWisth= this.listView1.Columns.Cast<ColumnHeader>()
            .Where(x => x.Index < this.listView1.Columns.Count - 1)
            .Sum(x => x.Width);
        this.listView1.Columns[this.listView1.Columns.Count - 1].Width = 
            this.listView1.ClientSize.Width - otherItemWisth;
    }
    
    private void ListViewSample_加载(对象发送方,事件参数e)
    {
    var otherItemWisth=this.listView1.Columns.Cast()
    .Where(x=>x.Indexx.Width);
    this.listView1.Columns[this.listView1.Columns.Count-1]。宽度=
    this.listView1.ClientSize.Width-otherItemWith;
    }
    
    结果


    您使用的是列表视图还是DataGridView?listView的详细信息使能功能正常:)(我懒得自己绘制所有这些东西,但自动填充是最重要的)谢谢!我添加了填充代码和业主图纸代码:-)完整答案。我建议使用
    VisualStyleRenderer
    ,以获得更好的外观和感觉。如果你能看到我的帖子并发现它很有用,我会很高兴的:)是的,你是对的,在这种情况下,它确实做得很好+1.注意,您应该在列宽例程中使用LV的ClientSize.Width。我把它放在一个函数中,以便在以后事情可能发生变化时调用它。。
    private void ListViewSample_Load(object sender, EventArgs e)
    {
        var otherItemWisth= this.listView1.Columns.Cast<ColumnHeader>()
            .Where(x => x.Index < this.listView1.Columns.Count - 1)
            .Sum(x => x.Width);
        this.listView1.Columns[this.listView1.Columns.Count - 1].Width = 
            this.listView1.ClientSize.Width - otherItemWisth;
    }