首页 > 代码库 > datagridview实现复制粘贴
datagridview实现复制粘贴
private void StepArtDgv_KeyUp(object sender, KeyEventArgs e)
{
//粘贴
if (e.KeyCode == Keys.V && e.Control)
{
// 获取剪切板的内容,并按行分割
string pasteText = Clipboard.GetText().Replace("\r\n", "@").TrimEnd(‘@‘);
//选中区域是区块后,
int xzRowCount_Z = StepArtDgv.SelectedCells[StepArtDgv.SelectedCells.Count - 1].RowIndex;//选中左上角的单元格的行索引
int xzColCount_Z = StepArtDgv.SelectedCells[StepArtDgv.SelectedCells.Count - 1].ColumnIndex;//选中左上角的单元格的列索引
int xzRowCount_Y = StepArtDgv.CurrentCell.RowIndex;//选中右下角的单元格的列索引
int xzColCount_Y = StepArtDgv.CurrentCell.ColumnIndex;//选中右下角的单元格的行索引
int Colcounts = xzColCount_Y + 1 - StepArtDgv.SelectedCells[StepArtDgv.SelectedCells.Count - 1].ColumnIndex;//粘贴区域的列数
int Rowcounts = xzRowCount_Y + 1 - StepArtDgv.SelectedCells[StepArtDgv.SelectedCells.Count - 1].RowIndex;//粘贴区域的行数
int MaxRowIndex = StepArtDgv.Rows.Count - 1; //获取做大的行数,最下面的行索引
int MaxColIndex = StepArtDgv.ColumnCount - 1; //获取做大的列数,最右面的行索引
//临时变量,索引随时都有可能在曾东增加,然而增加后无法还原,所以采用临时变量存储
int tempRowIndexs = xzRowCount_Z;
int tempColumnIndexs = xzColCount_Z;
if (xzColCount_Z == 0)
{
MessageBox.Show("项目名称不能粘贴!");
return;
}
string[] Row = null;
Row = pasteText.Split(‘@‘);//分割的行数数组
string[] col = null;//分割行后的列,每行的内容
col = Row[0].Replace("\t", "#").TrimEnd(‘#‘).Split(‘#‘);//专门存储列数
//判断是否存在非数字类型
for (int t = 0; t < Row.Length; t++)
{
col = Row[t].Replace("\t", "#").TrimEnd(‘#‘).Split(‘#‘);
//for (int t1 = 0; t1 < col.Length; t1++)
//{
////判断字符串
//if (!reg.IsMatch(col[t1].ToString().Trim()))
//{
// MessageBox.Show("粘贴的内容存在非数字类型!");
// return;
//}
//}
}
if (Row.Length > 0)
{
//粘贴区块,列行都是选中的倍数
if (Rowcounts % Row.Length == 0 && Colcounts % col.Length == 0)
{
for (int cs = 0; cs < Colcounts / col.Length; cs++)
{
for (int rs = 0; rs < Rowcounts / Row.Length; rs++)
{
for (int r = 0; r < Row.Length; r++)
{
if (xzRowCount_Z > MaxRowIndex) break;//跳出行
//获取每行中的内容
string rowMessage = Row[r].Replace("\t", "#").TrimEnd(‘#‘);
col = rowMessage.Split(‘#‘);
for (int c = 0; c < col.Length; c++)
{
if (xzColCount_Z > MaxColIndex) break;//粘贴内容出了DGV的区域,跳出该循环,进行下一行
StepArtDgv.Rows[xzRowCount_Z].Cells[xzColCount_Z].Value = http://www.mamicode.com/col[c];
xzColCount_Z++;
}
xzRowCount_Z++;
xzColCount_Z = tempColumnIndexs;//因为列自增了,需要还原,进行下一行填充
}
}
xzRowCount_Z = tempRowIndexs;//行数从头开始
xzColCount_Z += col.Length;//列增加
tempColumnIndexs += col.Length;//列的临时变量也要跟着变
}
}//粘贴区块,行是选中的行的倍数
else if (Rowcounts % Row.Length == 0)
{
for (int rs = 0; rs < Rowcounts / Row.Length; rs++)
{
for (int r = 0; r < Row.Length; r++)
{
if (xzRowCount_Z > MaxRowIndex) break;//跳出行
//获取每行中的内容
string rowMessage = Row[r].Replace("\t", "#").TrimEnd(‘#‘);
col = rowMessage.Split(‘#‘);
for (int c = 0; c < col.Length; c++)
{
if (xzColCount_Z > MaxColIndex) break;//粘贴内容出了DGV的区域,跳出该循环,进行下一行
StepArtDgv.Rows[xzRowCount_Z].Cells[xzColCount_Z].Value = http://www.mamicode.com/col[c];
xzColCount_Z++;
}
xzRowCount_Z++;
xzColCount_Z = tempColumnIndexs;//因为列自增了,需要还原,进行下一行填充
}
xzColCount_Z = tempColumnIndexs;//因为列自增了,需要还原,进行下一行填充
}
}//粘贴区块,列是选中的列的倍数
else if (Colcounts % col.Length == 0)
{
for (int cs = 0; cs < Colcounts / col.Length; cs++)
{
for (int r = 0; r < Row.Length; r++)
{
if (xzRowCount_Z > MaxRowIndex) break;//跳出行
//获取每行中的内容
string rowMessage = Row[r].Replace("\t", "#").TrimEnd(‘#‘);
col = rowMessage.Split(‘#‘);
for (int c = 0; c < col.Length; c++)
{
if (xzColCount_Z > MaxColIndex) break;//粘贴内容出了DGV的区域,跳出该循环,进行下一行
StepArtDgv.Rows[xzRowCount_Z].Cells[xzColCount_Z].Value = http://www.mamicode.com/col[c];
xzColCount_Z++;
}
xzColCount_Z = tempColumnIndexs;
xzRowCount_Z++;//行数从头开始
}
xzRowCount_Z = tempRowIndexs;//行数从头开始
xzColCount_Z += col.Length;//列增加
tempColumnIndexs += col.Length;//列的临时变量也要跟着变
}
} //粘贴区块小于选中区块(粘贴区块只是一个单元格 || 行和列小于粘贴区块 || 不是行或者列的倍数)
else if (Rowcounts <= Row.Length && Colcounts <= col.Length || Rowcounts % Row.Length != 0 || Colcounts % col.Length != 0)
{
for (int r = 0; r < Row.Length; r++)//循环行
{
if (xzRowCount_Z > MaxRowIndex) break;//跳出行
//获取每行中的内容
string rowMessage = Row[r].Replace("\t", "#").TrimEnd(‘#‘);
col = rowMessage.Split(‘#‘);
//为每个单元格赋值
for (int c = 0; c < col.Length; c++)
{
if (xzColCount_Z > MaxColIndex) break;//粘贴内容出了DGV的区域,跳出该循环,进行下一行
StepArtDgv.Rows[xzRowCount_Z].Cells[xzColCount_Z].Value = http://www.mamicode.com/col[c];
xzColCount_Z++;
}
xzRowCount_Z++;//下一行
xzColCount_Z = tempColumnIndexs;//因为列自增了,需要还原,进行下一行填充
}
}
}
}
}
datagridview实现复制粘贴