如何在列表视图中为 ItemCheck 创建事件处理程序



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

我玩过它一点,但我遇到了一些问题。首先,我无法通过这样做来创建事件处理程序: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 个不同列表视图的方式:

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)

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

item.Tag = 1;

然后在查看选中的项目时引用此内容。

更新

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

lvPC.ItemChecked += new ItemCheckedEventHandler(CheckedState);

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

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

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

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

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

lvPC.ItemChecked += new ItemCheckedEventHandler(CheckedState);

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

在 Visual Studio 中,只需键入 += 部分,然后按两次"tab"(一次用于"新处理程序"部分,一次用于它应调用的方法(,就可以避免事件处理程序不匹配的问题,然后它应该为您创建所有内容。

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

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

相关内容

  • 没有找到相关文章

最新更新