datagridview复制粘贴⾏与单元格内容
最近遇到⼀个关于datagridview快捷键复制、粘贴、剪切、删除等操作的问题:在⼀个主菜单中定义了Ctrl+C、Ctrl+V、Ctrl+T、Delete 等快捷键操作的主界⾯中,MDI⼦窗体的datagridview需要既能够使⽤这些快捷键操作表格的某⼀⾏,也能够在编辑状态操作单元格内容。
复制、粘贴、剪切、删除datagridview某⼀⾏内容在⽹上有很多资料,也不是本⽂的重点,这⾥就不做赘述;Datagridview⾃带Ctrl+C、Ctrl+VCtrl+C、Ctrl+V、Ctrl+T、Delete等快捷键操作。按理说结合两者就能实现功能了,但是⼆者并不能够在使⽤快捷键的时候兼容!
下⾯以Ctrl+C复制操作来说明,其他操作的下⾯以Ctrl+C复制操作来说明,其他操作的⽅法都差不多:玉木宏女友
主菜单的快捷键会将datagridview⾃带快捷操作屏蔽掉。软件中是在主窗体的复制函数中调⽤⼦窗体的复制函数:
柯震东 雪姨/// <summary>
/// 复制
/// </summary>
private void tsbtnCopy_Click(object sender, EventArgs e)
{
氮气的用途
if (Instance.ActiveMdiChild is IEdit)
{
IEdit form = Instance.ActiveMdiChild as IEdit;
form.Copy();
}
}
这样做实现整⾏复制完全没有问题;但是单元格内容的复制就不⾏了;⽆论何时按下Ctrl+C都会进⼊tsbtnCopy_Click⽅法,进⽽到⼦窗体的复制函数中,这是因为主菜单快捷键屏蔽的结果;要想实现复制单元格内容有如下两个思路:
1. 在复制⽅法中增加单元格选中内容的复制
范冰冰 李冰冰
2. 想办法在单元格编辑状态时调⽤datagridview⾃带的复制⽅法
思路1:
⾃⼰实现datagridview单元格内容的编辑操作,需要获取当前单元格内容的编辑状态;“光标位置”,“选中内容”这些都⽆法获知;果断放弃这个思路。
思路2:
按下快捷键,调⽤了⼦窗体复制函数;可以在函数体中判断是否有单元格处于编辑状态,如果有的话则⼿动调⽤datagridview⾃带复制⽅法;但是查遍datagridview⽅法都没有这个实现;细想⼀下,所有能够输⼊的编辑框如TextBox、ComboBox、ListBox等都⾃带复制操作,这应该是这些控件继承的⽗类或者接⼝的功能,已经被隐藏起来了。
实在想不出什么办法,⼜有其他事情暂时搁置……⼀周之后偶然间想到这个问题,为什么不从根本上去解决按键消息的问题呢?既然菜单快捷键会阻断datagridview的快捷操作,在datagridview是编辑状态时屏蔽菜单键的快捷操作就⾏了!
于是在datagridview进⼊和离开编辑状态时,修改响应菜单快捷键:
/// <summary>
/// 编辑状态,屏蔽菜单快捷键
祝寿词/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)        {
MainForm.Instance.EnableCopy(false);
}
/// <summary>
/// 离开编辑状态,恢复菜单快捷键
/// </summary>
/// <param name="sender"></param>
一年级数学下册期末试卷分析
/// <param name="e"></param>
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
MainForm.Instance.EnableCopy(true);
}