我们在使用DataGridView控件时,可能会有将一行的全部数据复制到另一行的需求,但是通过重写ProcessCmdKey接口后,使用组合键(Ctrl + C、Ctrl + V)不响应。
首先实现一下复制和粘贴一行的数据的代码逻辑。
m_CopyRow 为选中行的索引。
keyData == (Keys.C | Keys.Control) 为组合键(Ctrl + C)。
keyData == (Keys.V | Keys.Control) 为组合键(Ctrl + V)。
private int m_CopyRow = -1;
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.C | Keys.Control)
&& dataGridView.SelectedCells.Count > 0
&& !dataGridView.SelectedCells[0].IsInEditMode)
{
m_CopyRow = dataGridView.SelectedCells[0].RowIndex;
}
else if (keyData == (Keys.V | Keys.Control)
&& dataGridView.SelectedCells.Count > 0
&& !dataGridView.SelectedCells[0].IsInEditMode)
{
IDataObject idataObject = Clipboard.GetDataObject();
string[] s = idataObject.GetFormats();
string data;
if (!s.Any(f => f == "OEMText"))
{
if (!s.Any(f => f == "HTML Format"))
{
}
else
{
data = idataObject.GetData("System.String").ToString();//多个单元格
copyClipboardHtmltoGrid(data);
msg = new Message();
return base.ProcessCmdKey(ref msg, Keys.Control);
}
}
else
{
data = idataObject.GetData("OEMText").ToString();//单个单元格,处于未编辑状态
int rowStart = dataGridView.SelectedCells[0].RowIndex;
int columnStart = dataGridView.SelectedCells[0].ColumnIndex;
dataGridView.Rows[rowStart].Cells[columnStart].Value = data;
return base.ProcessCmdKey(ref msg, Keys.Control);
}
m_CopyRow = -1;
}
return base.ProcessCmdKey(ref msg, keyData);
}
我的dataGridView中一共有四列,我需要把一行中所有的数据进行复制。所以一对一赋值。
private void copyClipboardHtmltoGrid(string data)
{
string[] rows = data.Split(new string[] { "\r\n" }, StringSplitOptions.None);
int rowStart = 0;
if (this.dataGridView.SelectedCells.Count > 0)
{
rowStart = this.dataGridView.SelectedCells[0].RowIndex;
dataGridView.Rows[rowStart].Cells[0].Value = dataGridView.Rows[m_CopyRow].Cells[0].Value;
dataGridView.Rows[rowStart].Cells[1].Value = dataGridView.Rows[m_CopyRow].Cells[1].Value;
dataGridView.Rows[rowStart].Cells[2].Value = dataGridView.Rows[m_CopyRow].Cells[2].Value;
dataGridView.Rows[rowStart].Cells[3].Value = dataGridView.Rows[m_CopyRow].Cells[3].Value;
}
}
组合键不响应问题解决
1.一开始我是这么写的 keyData == (Keys.Control | Keys.C),网上说写成 keyData == (Keys.C | Keys.Control )就可以响应了,但是我试了以后仍然不起作用。
2.又有人说把主窗体的keypreview属性设置为true,我设置了也不起作用。
3.于是在DataGridView控件本身上找原因,发现DataGridView的EditMode属性我最开始设置的是EditOneEnter,把它设置成EditOnKeystrokeOrF2就可以响应了。
分析原因:
可能是设置成EditOneEnter,鼠标点击这一行中某一个数据时,会优先响应单击事件,就没法使组合键起作用,所以改成EditOnKeystrokeOrF2就把避免了这种情况。