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

时间:2016-05-08 13:51:24

标签: c# winforms listview

我在C#中有一个Windows应用程序,我想根据他们的分数对人们进行排名,分为3个级别;第一级得分最高,第二级得分最高,第三级得分最高。

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

enter image description here

1 个答案:

答案 0 :(得分:2)

如果没有owner-drawing ListView,那么这是不可能的。

原因是ShowGroups属性。

如果错误,您可以为每个Position计算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,则无效。计算偏移量也不是一项简单的任务;毕竟它会有所不同,具体取决于组和行中Items 两者的数量。

所以你必须拥有ListView所有权,这将有效,但在确定确切位置时会遇到同样的问题。

以两个项目为中心会使整个布局看起来像锯齿状和丑陋,imo。

也许最简单的解决方案是解决方法:只需在需要的地方添加虚拟物品。它的图像是透明的或其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); 

    }
}

当然,现在您的ListView ..

中有一个可点击的虚拟物品

如果您想在群组中重新订购更多Items,则需要将它们全部删除到列表中,然后按新订单重新添加。

enter image description here enter image description here