首先重寫OnMouseDown方法,由於剛剛說到的折射效果,需要將鼠標光標位置 從控件客戶區坐標轉換為文檔視圖坐標。然後設置LastMousePosition變量,該變量服務於鼠 標拖拽操作。遍歷表格文檔的所有的單元格對象,判斷單元格的邊框是否包含鼠標光標所在 位置,然後根據需要設置單元格的選擇狀態,若單元格的選擇狀態發生改變,則調用 InvalidateCell方法聲明該單元格樣式無效,准備重新繪制該單元格。
然後重寫 OnMouseMove方法,首先進行鼠標光標位置坐標轉換,若LastMousePosition有效,則說明用 戶正在拖拽鼠標,然後根據LastMousePosition坐標和當前鼠標光標坐標獲得一個選擇區域矩 形,然後遍歷所有單元格,判斷選擇矩形和單元格邊框是否相交,並設置單元格的選擇狀態 ,若單元格的選擇狀態發生改變則聲明該單元格樣式無效,准備重新繪制界面。
重寫 OnMouseUp方法,設置LastMousePosition變量無效,結束鼠標拖拽操作。
復制數據
程序主窗體上有一個復制按鈕,按下該按鈕可以進入到控件的Copy方法。代碼為
/// <summary>
/// 復制選擇的單元格的文本
/// </summary>
public void Copy()
{
System.Text.StringBuilder myStr = new System.Text.StringBuilder();
foreach( CellRow row in myDocument )
{
bool find = false;
foreach( Cell cell in row )
{
if( cell.Selected )
{
myStr.Append( cell.Text );
myStr.Append( " " );
find = true ;
}
}
if( find )
myStr.Append( System.Environment.NewLine );
}
if( myStr.Length > 0 )
{
System.Windows.Forms.DataObject data = new DataObject();
data.SetData( myStr.ToString());
System.Windows.Forms.Clipboard.SetDataObject( data , true );
}
}