如何为ListView中的项目创建事件处理程序?

时间:2011-12-08 00:32:25

标签: c# .net listview event-handling

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

我玩了一点但我遇到了一些问题。首先,我无法通过执行以下操作来创建事件处理程序:lvPC.ItemChecked += new EventHandler(CheckedState);会导致错误:No overload for 'CheckedState' matches delegate 'System.EventHandler'

其次,我怎样才能获得物品的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);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

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

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

其次,您可以在添加的每个Tag中设置ListViewItem属性:

item.Tag = 1;

然后在查看选中的项目时引用它。

<强>更新

错过了初始响应中CheckedState事件的分配。它应该是:

lvPC.ItemChecked += new ItemCheckedEventHandler(CheckedState);

答案 1 :(得分:1)

我可能误解了您的问题,但如果您只想删除按钮上的已检查项目,我认为您不需要收听ItemChecked事件来跟踪检查哪些项目。

相反,只需在单击按钮时循环检查已检查的项目,然后将其从ListView中删除:

private void button1_Click(object sender, EventArgs e)
{
    foreach (ListViewItem item in listView1.CheckedItems)
    {
        listView1.Items.Remove(item);
    }
}

如果您只想删除某些已检查的项目,请在上面的循环中查看该项目并确定是否要删除该项目,使用文本中存储的值或项目的tag ,正如competent_tech所建议的那样。

答案 2 :(得分:1)

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

lvPC.ItemChecked += new ItemCheckedEventHandler(CheckedState);

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

在Visual Studio中,只需键入+=部分然后点击“tab”两次(一次用于“新处理程序”部分,一次用于它应该调用的方法),就可以避免不匹配的EventHandler问题,它应该为你创造一切。

优点是您应该将选中的项目从“e.Item”强制转换为您想要的对象,然后将其从绑定列表中删除,并在需要时执行数据库删除。

希望这会有所帮助,我知道这不是第一个答案,但它确实回答了你们的两个问题......