我正在尝试删除详细列表中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);
}
}
}
}
答案 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”强制转换为您想要的对象,然后将其从绑定列表中删除,并在需要时执行数据库删除。
希望这会有所帮助,我知道这不是第一个答案,但它确实回答了你们的两个问题......