我在ListView
上添加了一个keyPress事件。通过我的事件断点,我可以看到大多数键触发事件。然而,其中一些,我感兴趣的(删除),只是不会触发我的事件。
这有点奇怪吗?不,我的键盘上没有坏键:D
private void listView1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Delete)
{
ListView target = (ListView)sender;
if (target.SelectedIndices != null && target.SelectedIndices.Count > 0)
{
string ric = target.SelectedItems[0].SubItems[0].Text;
//target.Items.RemoveAt(target.SelectedIndices[0]);
ListModels.getInstance().getModel("Vols").removeRic(ric);
}
}
}
答案 0 :(得分:38)
原因是KeyPress事件根据您按下的字符键向控件发送一个字符。但是,正如您所期望的那样,删除键不代表字符,因此是非字符键。
因此,使用KeyPress事件将不会发生任何事情,因为您已经注意到了。您应该使用KeyDown或KeyUp事件,其中任何一个都可以正常工作。细微之处在于您是否希望在按下或放开钥匙时触发事件。
答案 1 :(得分:4)
您需要使用KeyDown
事件。
答案 2 :(得分:3)
改用keyDown
; keyPress
类似于完整keyDown
+ keyUp
答案 3 :(得分:2)
在KeyDown中使用以下条件,
if (e.KeyCode == Keys.Delete)
{
// Your Logic....
}
答案 4 :(得分:1)
问题是如果你将EditMode属性设置为EditOnEnter,它就不会被激活。如果您使用EditOnKeyStrokeOfF2,它将触发事件
答案 5 :(得分:0)
如果您正在寻找用户只能从定义的项目中进行选择的解决方案,那么我相信您可以这样做:
private void DropDownRank_KeyDown(object sender, KeyEventArgs e)
{
e.SuppressKeyPress = true;
}
答案 6 :(得分:0)
查看此代码:
private void Form1_Load(object sender, EventArgs e)
{
listView1.KeyUp += new KeyEventHandler(ListView_KeyUp);
}
/// <summary>鍵盤觸發 ListView 清單</summary>
private void ListView_KeyUp(object sender, KeyEventArgs e)
{
ListView ListViewControl = sender as ListView;
if (e.KeyCode == Keys.Delete)
{
foreach (ListViewItem eachItem in ListViewControl.SelectedItems)
{
ListViewControl.Items.Remove(eachItem);
}
}
}
答案 7 :(得分:0)
我尝试了上面提到的所有内容,但对我没有任何帮助,所以我张贴了我的实际工作内容,以期希望帮助其他与我有相同问题的人
在构造函数中添加事件处理程序:
public partial class Test
{
public Test()
{
this.RemoveHandler(KeyDownEvent, new KeyEventHandler(Test_KeyDown));
// im not sure if the above line is needed (or if the GC takes care of it
// anyway) , im adding it just to be safe
this.AddHandler(KeyDownEvent, new KeyEventHandler(Test_KeyDown), true);
InitializeComponent();
}
//....
private void Test_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete)
{
//your logic
}
}
}