用戶在使用WinForms應用程序時,為了快速的輸入數據,通常會在DataGridView與Excle之間進行復制、剪切、粘貼操作。將Excel中的數據復制到DataGridView時,直接使用Excel中的復制、剪切功能,需要在DataGridView中實現粘貼功能;將DataGridView中數據復制到DataGridView或Excel中時,需要在DataGridView中實現復制、剪切、粘貼功能。
DataGridView.ClipboardCopyMode 屬性被設定為 DataGridViewClipboardCopyMode.Disable 以外的情況時,「Ctrl + C」 按下的時候,被選擇的單元格的內容會拷貝到系統剪切板內(DataGridView已提供了復制方法),可以直接粘貼到Excel 中,但在DataGridView中沒有提供粘貼方法,需要自己定義。
以下分別演示在DataGridView中實現復制、剪切、粘貼功能:
/// <summary>
/// 實現復制功能,將DataGridView中選定單元格的值復制到剪貼板中
/// </summary>
/// <param name="dgv_Test"></param>
private void CopyData(DataGridView dgv_Test)
{
Clipboard.SetDataObject(dgv_Test.GetClipboardContent());
}
/// <summary>
/// 實現剪切功能,將DataGridView中選定單元格的值復制到剪貼板中,並將選中的單元格的值清空
/// </summary>
/// <param name="dgv_Test"></param>
private void CutData(DataGridView dgv_Test)
{
//將選定單元格的值復制到剪貼板中
Clipboard.SetDataObject(dgv_Test.GetClipboardContent());
string clipboardText = Clipboard.GetText(); //獲取剪貼板的內容
if (string.IsNullOrEmpty(clipboardText))
{
return;
}
int colnum = 0;
int rownum = 0;
for (int i = 0; i < clipboardText.Length; i++)
{
if (clipboardText.Substring(i,1) == "\t")
{
colnum++;
}
if (clipboardText.Substring(i,1) == "\n")
{
rownum++;
}
}
//粘貼板上的數據來源於EXCEL時,每行末尾都有\n,來源於DataGridView是,最后一行末尾沒有\n
if (clipboardText.Substring(clipboardText.Length-1,1) == "\n")
{
rownum--;
}
colnum = colnum / (rownum + 1);
//獲取當前選中的最后一個單元格的列、行序號
int colIndex = dgv_Test.SelectedCells[0].ColumnIndex;
int rowIndex = dgv_Test.SelectedCells[0].RowIndex;
for (int i = 0; i <= rownum; i++)
{
for (int j = 0; j <= colnum; j++)
{
dgv_Test.Rows[rowIndex - i].Cells[colIndex - j].Value = "";
}
}
}
/// <summary>
/// 實現粘貼功能,將剪貼板中的內容粘貼到DataGridView中
/// </summary>
/// <param name="dgv_Test"></param>
private void PasteData(DataGridView dgv_Test)
{
try
{
string clipboardText = Clipboard.GetText(); //獲取剪貼板中的內容
if (string.IsNullOrEmpty(clipboardText))
{
return;
}
int colnum = 0;
int rownum = 0;
for (int i = 0; i < clipboardText.Length; i++)
{
if (clipboardText.Substring(i,1) == "\t")
{
colnum++;
}
if (clipboardText.Substring(i,1) == "\n")
{
rownum++;
}
}
//粘貼板上的數據來源於EXCEL時,每行末尾都有\n,來源於DataGridView是,最后一行末尾沒有\n
if (clipboardText.Substring(clipboardText.Length-1,1) == "\n")
{
rownum--;
}
colnum = colnum / (rownum + 1);
object[,] data; //定義object類型的二維數組
data = new object[rownum + 1, colnum + 1]; //根據剪貼板的行列數實例化數組
string rowStr = "";
//對數組各元素賦值
for (int i = 0; i <= rownum; i++)
{
for (int j = 0; j <= colnum; j++)
{
//一行中的其它列
if (j != colnum)
{
rowStr = clipboardText.Substring(0, clipboardText.IndexOf("\t"));
clipboardText = clipboardText.Substring(clipboardText.IndexOf("\t") + 1);
}
//一行中的最后一列
if (j == colnum && clipboardText.IndexOf("\r") != -1)
{
rowStr = clipboardText.Substring(0, clipboardText.IndexOf("\r"));
}
//最后一行的最后一列
if (j == colnum && clipboardText.IndexOf("\r") == -1)
{
rowStr = clipboardText.Substring(0);
}
data[i, j] = rowStr;
}
//截取下一行及以后的數據
clipboardText = clipboardText.Substring(clipboardText.IndexOf("\n") + 1);
}
//獲取當前選中單元格的列序號
int colIndex = dgv_Test.CurrentRow.Cells.IndexOf(dgv_Test.CurrentCell);
//獲取當前選中單元格的行序號
int rowIndex = dgv_Test.CurrentRow.Index;
for (int i = 0; i <=rownum; i++)
{
for (int j = 0; j <= colnum; j++)
{
dgv_Test.Rows[i + rowIndex].Cells[j + colIndex].Value = data[i, j];
}
}
}
catch
{
MessageBox.Show("粘貼區域大小不一致");
return;
}
}
//測試代碼
private void tsmi_Copy_Click(object sender, EventArgs e)
{
CopyData(dgv_PersonInfo);
}
private void tsmi_Cut_Click(object sender, EventArgs e)
{
CutData(dgv_PersonInfo);
}
private void tsmi_Paste_Click(object sender, EventArgs e)
{
PasteData(dgv_PersonInfo);
}
一本深入了解CLR和.NET Framework的C#經典書籍,值得有一定基礎的人員所擁有,在此推薦給大家。