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

5 c# listview winforms

我正在尝试用 C# 编写 Windows 窗体 MusicPlayer 应用程序。

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

我半小时前才开始,但我的设计已经快完成了。现在我有 3 件事需要解决。一个错误和两个好看的东西:

  1. 在图片上你可以看到我发现的错误。你可能会说这没什么,但它很引人注目。我怎样才能解决这个问题?

    -

  2. 如何使列标题居中而不居中内容?

  3. 如何使最后一列填充 listView 的其余部分?

TaW*_*TaW 4

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

  • 没有自动填充选项,因此您需要编写一个setColumnwidth函数,该函数循环遍历除最后一列之外的所有列并对它们求和Widths;然后它从 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;
}
Run Code Online (Sandbox Code Playgroud)

设置完成后,OwnerDraw = true您可以对三个(都需要!)绘制事件进行编码:

private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
    e.Graphics.FillRectangle(SystemBrushes.Menu, e.Bounds);
    e.Graphics.DrawRectangle(SystemPens.GradientInactiveCaption, 
        new Rectangle(e.Bounds.X , 0, e.Bounds.Width , e.Bounds.Height) );

    string text = listView1.Columns[e.ColumnIndex].Text;
    TextFormatFlags cFlag = TextFormatFlags.HorizontalCenter 
                          | TextFormatFlags.VerticalCenter;
    TextRenderer.DrawText(e.Graphics, text, listView1.Font, e.Bounds, Color.Black, cFlag);
}

private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
    e.DrawDefault = true;
}

private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
    e.DrawDefault = true;
}
Run Code Online (Sandbox Code Playgroud)

您可能想稍微调整一下颜色或宽度。

如果您有一个包含用于显示排序顺序(或其他内容)的图像的 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);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述