gpt4 book ai didi

c# - 尝试对顶部未选中项目的 ListView 进行排序,然后按 ID : compare routine throws an odd exception

转载 作者:行者123 更新时间:2023-11-30 17:20:45 26 4
gpt4 key购买 nike

我正在构建一个桌面待办事项列表应用程序,在我的 UI 中我有一个 ListView控件列出每个列表中的所有项目。每个项目/行都有一个复选框,用于在选中或取消选中时更新数据库中该项目的状态。到目前为止一切顺利!

我试图做的是在单击复选框时对列表重新排序,以便列表始终将未选中的项目排在顶部,然后按 ID(存储在中的 int 值)排序加载列表时每个 TagListViewItem 属性)。

我已经编写了一个实现 IComparer 的自定义比较器并调用Sort()ListView 上在ItemChecked事件处理程序:

/// <summary>
/// Complete or uncomplete a todo item when it's checked/unchecked
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void _taskList_ItemChecked(object sender, ItemCheckedEventArgs e)
{
var list = sender as ListView;
var itemId = e.Item.Tag.ToString();

if(e.Item.Tag != null)
{
if(e.Item.Checked)
// Do some database stuff here to mark as complete
else
// Do some database stuff here to mark as not completed
}

// Resort the listview
list.ListViewItemSorter = new TaskListComparer();
list.Sort();
}

这是我的比较器:

public class TaskListComparer : IComparer
{
public TaskListComparer()
{
}

public int Compare(object a, object b)
{
// Convert the two passed values to ListViewItems
var item1 = a as ListViewItem;
var item2 = b as ListViewItem;

// Get the unique ID's of the list items (stored in the Tag property)
var item1Id = Convert.ToInt32(item1.Tag);
var item2Id = Convert.ToInt32(item2.Tag);

// First sort on the Checked property (unchecked items should be at the top)
if (item1.Checked && !item2.Checked)
return 1;
else if (!item1.Checked && item2.Checked)
return -1;

// If both items were checked or both items were unchecked,
// sort by the ID (in descending order)
if (item1Id > item2Id)
return 1;
else if (item1Id < item2Id)
return -1;
else
return 0;
}
}

但是,当我检查一个项目时,在尝试排序时会抛出以下异常:

System.ArgumentOutOfRangeException was unhandled
Message="InvalidArgument=Value of '-1' is not valid for 'index'.\r\nParameter name: index"
Source="System.Windows.Forms"
ParamName="index"

在调试器中,如果我检查 item1.Checked我看到的比较例程中的属性:

'item1.Checked' threw an exception of type 'System.ArgumentOutOfRangeException'

其他项目的 Checked属性(property)显示罚款。我在这里做错了什么?

最佳答案

它看起来像 Index您的 ListViewItem-1(Checked 属性在内部使用 Index)。这通常是在将 ListViewItem 添加到 ListView 之前的情况。

在您的情况下,该项目可能已在排序过程中暂时从列表中删除。换句话说,从排序例程访问 Checked 属性看起来并不安全。

关于c# - 尝试对顶部未选中项目的 ListView 进行排序,然后按 ID : compare routine throws an odd exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4013521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com