我的(C#)程序中有listView。在将项目添加到listview后,我更改了一些项目背景和前景色。所有项目都可以和颜色一样。 如果我使用listView排序,那么所有前6项颜色都已消失。一些颜色的休息项目是无序的。 默认排序和我自己的自定义排序器会发生这种效果。 我对listView项目数据做了很多更改,最后当listView被多次排序时,所有颜色都处于正确的位置。 怎么了?
答案 0 :(得分:0)
稍微讨论一下,我不确定你做错了什么。似乎对我工作正常,但没有看到你的代码,很难说是发生了什么。在任何情况下,这是一个简单的工作示例,可以帮助您找出不同的东西。只需在详细信息视图中创建一个包含3列ListView的表单:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Color[] backgroundColors = new[] { Color.Green, Color.White, Color.Blue };
Color[] foregroundColors = new[] { Color.Black, Color.Red, Color.Yellow };
Random random = new Random();
for (int i = 0; i < 100; i++)
{
Color backgroundColor = backgroundColors[random.Next(0, 3)];
Color foregroundColor = foregroundColors[random.Next(0, 3)];
ListViewItem listViewItem = listView1.Items.Add(foregroundColor.Name);
listViewItem.SubItems.Add(backgroundColor.Name);
listViewItem.SubItems.Add(Guid.NewGuid().ToString());
listViewItem.BackColor = backgroundColor;
listViewItem.ForeColor = foregroundColor;
}
listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
}
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
ListViewItemComparer listViewItemComparer = new ListViewItemComparer {SortColumn = e.Column, Sorting = SortOrder.Ascending};
if (listView1.ListViewItemSorter is ListViewItemComparer)
{
ListViewItemComparer listViewItemComparerOld = listView1.ListViewItemSorter as ListViewItemComparer;
if (listViewItemComparerOld != null && listViewItemComparerOld.SortColumn == e.Column)
{
listViewItemComparer.Sorting = (listViewItemComparerOld.Sorting == SortOrder.Ascending) ? SortOrder.Descending : SortOrder.Ascending;
}
}
listView1.ListViewItemSorter = listViewItemComparer;
listView1.Sort();
}
#region ListViewItemComparer
public class ListViewItemComparer : IComparer
{
#region Public Properties
public int SortColumn { get; set; }
public SortOrder Sorting { get; set; }
#endregion
public ListViewItemComparer()
{
SortColumn = 0;
Sorting = SortOrder.Ascending;
}
public int Compare(object x, object y)
{
ListViewItem listViewItem1 = null;
ListViewItem listViewItem2 = null;
string compare1 = string.Empty;
string compare2 = string.Empty;
if (Sorting == SortOrder.Ascending)
{
listViewItem1 = (ListViewItem)x; listViewItem2 = (ListViewItem)y;
}
if (Sorting == SortOrder.Descending)
{
listViewItem1 = (ListViewItem)y; listViewItem2 = (ListViewItem)x;
}
if (listViewItem1 != null && (SortColumn < listViewItem1.SubItems.Count) && (listViewItem1.SubItems[SortColumn] != null))
{
compare1 = listViewItem1.SubItems[SortColumn].Text;
}
if (listViewItem2 != null && (SortColumn < listViewItem1.SubItems.Count) && (listViewItem2.SubItems[SortColumn] != null))
{
compare2 = listViewItem2.SubItems[SortColumn].Text;
}
return string.Compare(compare1, compare2);
}
}
#endregion
}
答案 1 :(得分:0)
现在它有效。我只是关闭排序:
listView1.ListViewItemSorter = null;
在完成所有更改后,再次打开排序:
listView1.ListViewItemSorter = new Sorter();