C# 如何为ListView中的ItemChecked创建EventHandler?

C# 如何为ListView中的ItemChecked创建EventHandler?,c#,.net,listview,event-handling,C#,.net,Listview,Event Handling,我正在尝试删除详细列表中ListView项上的每个选中项。我不想在检查时删除条目,但将一个值传递给我的按钮,该按钮将使用一个值来删除条目 我玩了一点,但遇到了一些问题。首先,我不能通过这样做来创建事件处理程序:lvPC.ItemChecked+=neweventhandler(CheckedState)导致错误:没有与委托“System.EventHandler”匹配的“CheckedState”重载。 第二,如何获取项目的ID?我这样说的意思是,每个添加的条目都有自己的ID,但它没有添加到表视

我正在尝试删除详细列表中ListView项上的每个选中项。我不想在检查时删除条目,但将一个值传递给我的按钮,该按钮将使用一个值来删除条目

我玩了一点,但遇到了一些问题。首先,我不能通过这样做来创建事件处理程序:
lvPC.ItemChecked+=neweventhandler(CheckedState)导致错误:
没有与委托“System.EventHandler”匹配的“CheckedState”重载。

第二,如何获取项目的ID?我这样说的意思是,每个添加的条目都有自己的ID,但它没有添加到表视图中。意思是我如何决定应该删除哪个ID

private void CheckedState
    (object sender, System.Windows.Forms.ItemCheckEventArgs e)
{
    ListView.CheckedListViewItemCollection 
        checkedItems = lvPC.CheckedItems;

    string items;

    foreach (ListViewItem item in checkedItems)
    {
        items = item + ", "; 
        MessageBox.Show(items);
    }

    if (e.CurrentValue == CheckState.Unchecked)
    {
    }
    else if ((e.CurrentValue == CheckState.Checked))
    {
    }
}
这就是我将数据插入3个不同ListView的方式:

using (OleDbDataReader read = command.ExecuteReader())
{
    // Checking if there is any data in the file.
    if (read.HasRows)
    {
        // Reading information from the file.
        while (read.Read())
        {
            if (security.DecryptAES(read.GetString(1), 
                storedAuth.Password, storedAuth.UserName) 
                    == "PC Password")
            {
                PC = new ListViewItem("");
                PC.SubItems.Add(security.DecryptAES
                    (read.GetString(5), storedAuth.Password, 
                        storedAuth.UserName));
                PC.SubItems.Add(security.DecryptAES
                    (read.GetString(6), storedAuth.Password, 
                        storedAuth.UserName));

                lvPC.Items.Add(PC);
            }
            else if (security.DecryptAES(read.GetString(1), 
                storedAuth.Password, storedAuth.UserName) 
                    == "Web Site Password")
            {
                Web = new ListViewItem("");
                Web.SubItems.Add(security.DecryptAES
                    (read.GetString(2), storedAuth.Password, 
                        storedAuth.UserName));
                Web.SubItems.Add(security.DecryptAES
                    (read.GetString(5), storedAuth.Password, 
                        storedAuth.UserName));
                Web.SubItems.Add(security.DecryptAES
                    (read.GetString(6), storedAuth.Password, 
                        storedAuth.UserName));

                lvWeb.Items.Add(Web);
            }
            else if (security.DecryptAES(read.GetString(1), 
                storedAuth.Password, storedAuth.UserName) 
                    == "Serial Code")
            {
                Serial = new ListViewItem("");
                Serial.SubItems.Add(security.DecryptAES
                    (read.GetString(3), storedAuth.Password, 
                        storedAuth.UserName));
                Serial.SubItems.Add(security.DecryptAES
                    (read.GetString(4), storedAuth.Password, 
                        storedAuth.UserName));

                lvSerialCode.Items.Add(Serial);
            }
        }
    }
}

首先,事件的签名不正确。应该是:

void CheckedState(object sender, System.Windows.Forms.ItemCheckedEventArgs e)
lvPC.ItemChecked += new ItemCheckedEventHandler(CheckedState);
其次,您可以在添加的每个
ListViewItem
中设置
Tag
属性:

item.Tag = 1;
然后在查看选中的项目时引用此项

更新

在初始响应中未分配CheckedState事件。应该是:

void CheckedState(object sender, System.Windows.Forms.ItemCheckedEventArgs e)
lvPC.ItemChecked += new ItemCheckedEventHandler(CheckedState);

我可能误解了您的问题,但如果您只是想在单击按钮时删除选中的项目,我认为您不需要收听
ItemChecked
事件来跟踪选中的项目

相反,只需在单击按钮时循环检查选中的项目,并将其从
列表视图中删除即可:

private void button1_Click(object sender, EventArgs e)
{
    foreach (ListViewItem item in listView1.CheckedItems)
    {
        listView1.Items.Remove(item);
    }
}
如果您只想删除选中的某些项目,则在上面的循环中,查看该项目并确定是否要删除该项目,可以使用文本中存储的值或项目的
标记,如主管技术人员所建议

void CheckedState(object sender, System.Windows.Forms.ItemCheckedEventArgs e)

是解决方案的一部分,但在获得id后,我建议您创建一个小对象,将它们添加到BindingList并将其绑定到ListView

在VisualStudio中,只需键入
+=
部分,然后点击“tab”两次(一次是“新处理程序”部分,一次是它应该调用的方法),就可以避免不匹配的事件处理程序的问题,然后它应该为您创建所有的事件处理程序

这样做的好处是,您应该将选中的项从“e.item”强制转换为所需的对象,并将其从绑定列表中删除,如果需要,还可以执行数据库删除


希望这有帮助,我知道这不是第一个答案,但它确实回答了您的两个问题……

“lvPC.ItemChecked+=neweventhandler(CheckedState);”仍然会导致错误。@HelpNeeder:抱歉,忘记在原始响应中包含该错误。答案更新了。啊!谢谢我还可以从属性创建EventHandler。但是我喜欢用编程的方式来完成它。@HelpNeeder:注意,我还更新了答案,指出应该在项目上设置标记,而不是在您的listview上设置lvPC。完成了!您帮助我创建了事件处理程序,并指出要使用item标记。谢谢等等,除了从ListView中删除项之外,我还需要从数据库文件中删除then条目。我不确定如何通过这样做从数据库文件中选择项目ID。但这是我需要的半个答案+1.@HelpNeeder,那么我认为@Competable_tech提供了您答案的另一半:当您填充ListView时,将ID存储在项目的
标记中,然后在删除选中的项目时使用该标记,然后从数据库中删除它们。听起来你就快到了:)嗯。这让人困惑,因为Tab I虽然只用于整个ViewList,但不用于项。但我要试试这个。检查很好,因为我可以检查并删除,而无需使用“删除”按钮:D@HelpNeeder,
ListView
确实有一个
Tag
属性,但
ListViewItem
也有一个:。除非我能拥抱并亲吻SE服务器,这会带来像你这样的优秀人士来帮助像我这样的noob人:D