1. 需要实现类似于Excel的功能,就是在任意位置选中鼠标起点和终点所连对角线所在的矩形,进行复制粘贴。

2. 要实现这个功能,首先需要获取鼠标起点和终点点击的位置。

3. 所以通过GridView(我用的是dev这款插件)的MouseDown和MouseUp事件来获取这连个位置。MouseDown获得鼠标左键按下时的所在的行列信息,MouseUp获得鼠标左键抬起时的行列信息。然后简单加减法计算一共选中的行数和列数。

有了这个思路代码其实挺简单的。今天没时间了,明天贴代码。

----------------------------------------------------------------------------------------------

粘贴部分的代码

try
{
string pasteText = Clipboard.GetText().Replace("\r\n", "@").TrimEnd('@');//得到剪切板里的信息
string[] Row = pasteText.Split('@');//分割的行数数组
string[] col = Row[].Replace("\t", "#").TrimEnd('#').Split('#');//列数数组
//判断是否存在非数字类型
Regex rgx = new Regex(@"^[-]?\d+[.]?\d*$");
for (int t = ; t < Row.Length; t++)
{
col = Row[t].Replace("\t", "#").TrimEnd('#').Split('#');
for (int t1 = ; t1 < col.Length; t1++)
{
//判断字符串
if (!rgx.IsMatch(col[t1].ToString().Trim()))
{
XtraMessageBox.Show("粘贴的内容存在非数字类型!");
return;
}
}
} int _iRowCount = gridRowHandleEnd - gridRowHandleStar + ;//一共选择的行数
int _iColCount = gridColHandleEnd - gridColHandleStar + ;//一共选择的列数
for (int r = ; r < Row.Length; r++)
{
//获取每行中的内容
string rowMessage = Row[r].Replace("\t", "#").TrimEnd('#');
col = rowMessage.Split('#');
DataRow dr = dtInputSurveyData.Rows[gridRowHandleStar + r];//r是从0开始的,gridRowHandleStar+r的作用等同于gridRowHandleStar++
//判断外部复制内容的列数GridView中选中内容的列数的大小,最终粘贴内容的列数应与小的相同;
if (_iColCount < col.Length)
{
for (int i = ; i < _iColCount; i++)
{
dr[gridColHandleStar + i] = col[i];
}
}
else
{
for (int i = ; i < col.Length; i++)
{
dr[gridColHandleStar + i] = col[i];
}
}
}
}
catch (Exception ex)
{
XtraMessageBox.Show(ex.Message, Properties.Resources.ErrorTitle);
}

还需要在gridview的MouseDown和MouseUp事件中添加代码来获取鼠标按下和抬起时的位置(我这里用的是dev这款插件,所以我这里的gridview是gridcontrol 下的gridview)。

MouseDown:

try
{
//当鼠标按下时获取当前点击cell的位置信息
GridHitInfo _gridHI = gvInputSurveyData.CalcHitInfo(e.Location);
if (e.Button == MouseButtons.Left && _gridHI.RowHandle >= )
{
gridColHandleStar = _gridHI.Column.ColumnHandle;
gridRowHandleStar = _gridHI.RowHandle;
}
}
catch (Exception ex)
{
XtraMessageBox.Show(ex.Message, Properties.Resources.ErrorTitle);
}

MouseUp:

            GridHitInfo _gridHI = gvInputSurveyData.CalcHitInfo(e.Location);
if (e.Button == MouseButtons.Left && _gridHI.RowHandle >= )
{
gridColHandleEnd = _gridHI.Column.ColumnHandle;
gridRowHandleEnd = _gridHI.RowHandle;
}

这里两个Start 变量和两个end变量都是全局的,用来保存鼠标起始和终止的行列信息。

感谢您的阅读,不足之处请见谅。期待与您在评论区交流。

04-23 00:27