C# Windows应用程序:将组中的ListView项目与行的中心对齐

C# Windows应用程序:将组中的ListView项目与行的中心对齐,c#,winforms,listview,C#,Winforms,Listview,我有一个用C#编写的windows应用程序,我想根据人们的分数将他们分为3个级别;第一级得分最高者,第二级得分第三,第三级得分第三 我已经实现了这一点,如图所示,使用ListView和3个组成功地实现了这一点;我的问题是:我可以将每组中的项目对齐到中心吗?项目向左对齐 不,如果没有所有者绘图列表视图,这是不可能的 原因是ShowGroups属性的错误 如果为false,则可以计算每个ListViewItem的位置 下面是如何修改ListViewItem的位置: ListViewItem lvi

我有一个用C#编写的windows应用程序,我想根据人们的分数将他们分为3个级别;第一级得分最高者,第二级得分第三,第三级得分第三

我已经实现了这一点,如图所示,使用ListView和3个组成功地实现了这一点;我的问题是:我可以将每组中的项目对齐到中心吗?项目向左对齐


不,如果没有
所有者绘图
列表视图,这是不可能的

原因是
ShowGroups
属性的错误

如果为false,则可以计算每个
ListViewItem
位置

下面是如何修改
ListViewItem
的位置:

ListViewItem lvi = listView1.Items[3];
lvi.Position = new Point(lvi.Position.X + 50, lvi.Position.Y);
lvi.Text = "X testing X";
但不幸的是,如果
ListView
具有
ShowGroups=true
,则这不会产生效果。计算偏移量也不是一项简单的任务;毕竟,这取决于组和行中
项目的数量

因此,您必须自己绘制
列表视图
,这将起作用,但在确定确切位置时也会遇到同样的问题

在我看来,将两个项目放在中间会使整个布局看起来参差不齐,丑陋不堪

也许最简单的解决方案是一种变通方法:只需在需要的地方添加一个虚拟项。它的图像应该是透明的,或者它的
ImageIndex=-1及其文本为空或空白。您可以将它插入到具有奇数项的每个组中,这些奇数项不能被一行中的最大项数整除。在你的情况下3。或者,检查组是否只包含一项就足够了

以下是一个例子:

void InsertBlankItem(ListView lv, ListViewGroup lvg)
{
    ListViewItem lvOld = g.Items[0];
    lvg.Items.Remove(lvOld);
    ListViewItem lviBlank = new ListViewItem() { Text = " ", ImageIndex = -1 };
    lviBlank.Group = lvg;
    listView1.Items.Add(lviBlank);
    lvg.Items.Insert(1, lvOld);
}
这将添加一个空白项并将第一个项移动到末尾..:

private void button1_Click(object sender, EventArgs e)
{
    foreach (ListViewGroup g in listView1.Groups)
    {
        if (g.Items.Count == 1) InsertBlankItem(listView1, g); 

    }
}
当然,现在您的
列表视图中有一个可单击的虚拟项

如果要在一个组中重新订购更多的
项目
,则需要将它们全部删除到列表中,然后按新的顺序重新添加