我正在尝试删除详细列表中的列表视图项目上的每个选中项目。我不想在检查时删除条目,而是将一个值传递给我的按钮,该值将使用值删除条目。
我玩过它一点,但我遇到了一些问题。首先,我无法通过这样做来创建事件处理程序: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"强制转换为所需的对象,并将其从绑定列表中删除,并在需要时执行数据库删除。
希望这有帮助,我知道这不是第一个答案,但它确实回答了你的两个问题......