Spread for Windows Forms高階主題(4)---自定義使用者互動

weixin_34377065發表於2011-08-18

你可以從多方面自定義使用者介面來自定義使用者與Spread控制元件的互動方式。同時,你還可以自定義如何處理使用者互動方式。

設定允許使用者進行的操作

下面的列表總結了通過控制元件的資料區域,你可以授權使用者進行的操作(或者限制使用者進行的操作)。

允許的使用者功能

相關屬性或方法

拖拽單元格資料

FpSpread.AllowDragDrop 屬性

拖拽並填寫單元格資料

FpSpread.AllowDragFill 屬性

編輯單元格備註

SheetView.AllowNoteEdit 屬性

輸入公式

FpSpread.AllowUserFormulas屬性

篩選行

Column.AllowAutoFilter 屬性

展開或者摺疊層次樹

Get, SetRowExpandable

移動時鐘指標

FarPoint.PluginCalendar.WinForms. AllowMoveHands 屬性

移動行和列

FpSpread.AllowRowMove 屬性 和 FpSpread.AllowColumnMove 屬性

進行標準的檢索

FpSpread.SearchWithDialog 方法)

進行標準的檢索

FpSpread.SearchWithDialogAdvanced方法。

重置行或列的大小

列的Resizable屬性 和行的Resizable屬性

在列標題中,通過點選排序指示器進行篩選

Column.AllowAutoSort 屬性

   

這裡的列表總結了通過控制元件,你可以授權使用者進行的操作(或者限制使用者進行的操作)。

允許的使用者功能

相關屬性或方法

限制對行或者列的訪問

SheetView.RestrictColumns 屬性

SheetView.RestrictRows 屬性

放大,或者縮放元件顯示

FpSpread.AllowUserZoom 屬性

使用剪貼簿快捷鍵

FarPoint.Win.SuperEditBase. AllowClipboardKeys 屬性

編輯表單名稱

FpSpread.TabStrip.Editable 屬性

   

指定使用者可以選擇的物件

預設情況下,使用者可以在表單中選擇一個單元格、一列單元格、一行單元格或者整個表單。你可以使用表單操作方式下,選擇策略和表單單元來決定選擇如何發生。下列的表格總結了可用於指定使用者選擇內容的選項:

使用者可以選擇什麼

何時為表單設定

單元格

FpSpread.SelectionBlockOptions.Cells

FpSpread.SelectionBlockOptions.Rows

FpSpread.SelectionBlockOptions.Columns

表單

FpSpread.SelectionBlockOptions.Sheet

組合

FpSpread.SelectionBlockOptions.number。number 表示其他數字的組合(例如6 = 2 + 4,行和列)

單元格,區域單元格或者多區域單元格

OperationMode.Normal,根據SelectionPolicy屬性決定

只選擇行,不允許編輯

OperationMode.SingleSelect

只選擇行,允許編輯

OperationMode.RowMode

選擇多個連續的行,不允許編輯

OperationMode.MultiSelect

選擇多個非連續的行,不允許編輯

OperationMode.ExtendedSelect

注意FpSpread.SelectionBlockOptions設定在Spread控制元件層,而OperationMode位於表單層。

OperationMode 和 SelectionBlockOptions 屬性的設定將會影響使用者與表單互動,這意味著使用者可以選擇的內容不一定是應用程式可以選擇的。如果你想自定義使用者和應用程式均可選擇的內容,請設定SelectionUnit屬性。

你還可以使用RestrictRows 和 RestrictColumns方法來限定可以被編輯的單元格。該限制限定了使用者不能跨越到下一行或者列輸入資料。如果你需要更多的資訊,請參閱SheetView類的SelectionPolicy屬性和 SelectionUnit屬性,以及FpSpread類的SelectionBlockOptions屬性。如果你需要更多的細節,請參閱OperationMode列舉和SelectionBlockOptions 列舉.

下面的示例程式碼對錶單進行了相關設定,允許使用者只選擇一個單元格或者選擇一定區域內的單元格,包括多個區域的單元格。但是在本示例中使用者不能夠選擇列,行,或者整個表單。

// Set option so users can select only cells. fpSpread1.SelectionBlockOptions = FarPoint.Win.Spread.SelectionBlockOptions.Cells; // Set operation mode and let users select multiple blocks of cells. fpSpread1.Sheets[0].OperationMode = FarPoint.Win.Spread.OperationMode.Normal; fpSpread1.Sheets[0].SelectionPolicy = FarPoint.Win.Spread.Model.SelectionPolicy.MultiRange

如何使用選擇

當使用者選定一個區域內的單元格時,該區域的單元格可以擁有一個單獨的背景色和前景顏色,用來區分表單內的其他單元格。你可以通過程式設計處理選擇的多個方面。在程式碼中,你可以新增或者刪除選擇,並且你可以查詢被選擇的單元。本主題總結了你可以在程式碼中執行的一些操作。

  • 如果你希望新增一個選擇(一定區域的單元格以被選擇的方式顯示),你需要使用表單的AddSelection方法,並制定開始的行和列,以及選擇中的行數和列數。
  • 使用表單的GetSelections方法獲取以選擇形式顯示的區域單元格。使用表單的GetSelection方法返回一個特定選擇。
  • 使用表單的ClearSelection方法刪除所有的選擇。使用表單的RemoveSelection方法,並指定行和列刪除一個特定的選擇,該選擇的行號和列號同時從選擇中刪除。
  • 當通過程式設計設定了一個新的活動單元格時,請使用SetActiveCell方法中的布林型引數clearSelection清除所有的選擇。
  • 使用FpSpread類中的RetainSelectionBlock屬性使一個選擇保持高亮。
  • 你可以使用FpSpread類中的MoveActiveOnFocus屬性移動一個被選擇的單元格。
  • 如果你需要使用關於選擇的事件,請參閱SelectionChangedEventArgs類。

如果你需要選擇一個表單中所有的單元格,請使用該表單的RowCount 和 ColumnCount屬性,如下面的程式碼所示:

FpSpread1.ActiveSheet.Models.Selection.SetSelection(0, 0, FpSpread1.ActiveSheet.RowCount, FpSpread1.ActiveSheet.ColumnCount)

如果某一行或者某一列的所有單元格均被選擇(例如使用者點選行標題或者列標題進行了一次選擇),DefaultSheetSelectionModel類(以及IDisjointSelection介面)的 GetSelections方法將會返回-1給相應的RowCount或者ColumnCount。

下面的示例程式碼選擇了兩個區域的單元格。

// Set the sheet to allow multiple range selections. fpSpread1.Sheets[0].SelectionPolicy = FarPoint.Win.Spread.Model.SelectionPolicy.MultiRange; // Select cells C3 through D4. fpSpread1.Sheets[0].AddSelection(2, 2, 2, 2); // Select cells F6 through H8. fpSpread1.Sheets[0].AddSelection(5, 5, 3, 3);

 

自定義選擇外觀

Spread控制元件為選擇提供了一個預設的外觀。你可以改變選擇的外觀,包括背景色、前景色和字型等。你還可以使用ShowRowSelector屬性指定一個行選擇器圖示。

預設情況下,Spread控制元件使用選擇renderer設定的外觀。當選擇了一些內容時,renderer將會改變選擇的背景色。在不使用該renderer的情況下,你可以為選擇的背景和文字指定特定的顏色。或者你還可以同時使用renderer的外觀以及你自定義的顏色。你還可以指定不使用外觀對選擇進行高亮提示。

下圖依次展示了使用預設renderer樣式時被選擇單元格的外觀,使用設定顏色時被選擇單元格的外觀,和既使用renderer樣式,又使用自定義顏色時單元格的外觀。

image

如果沒有為選擇設定顏色,則預設顏色是Color.FromArgb(100, SystemColors.Highlight)。

被選擇單元格的繪製方式 取決於SheetView類中的不同屬性。

檢視屬性

描述

SelectionBackColor

確定選擇的背景色

SelectionForeColor

確定選擇的文字顏色

SelectionStyle

確定選擇的樣式(使用自定義顏色,定製的renderer或者兩者均使用)

SelectionFont

確定指定文字的字型

當SelectionStyle是SelectionColors時,單元格使用SelectionBackColor和SelectionForeColor設定代替單元格ForeColor和BackColor屬性設定進行繪製。當SelectionStyle是SelectionRenderer時,單元格使用單元格的ForeColor 和 BackColor屬性的設定進行繪製。然後一個半透明的層繪製於單元格之上。該半透明層使用了系統的高亮顏色(Alpha值為100)實現。

Brush selectionBrush = new SolidBrush(Color.FromArgb(100, SystemColors.Highlight)); g.FillRectangle(selectionBrush, x, y, width, height);

如果你需要更多的資訊,請參閱SelectionStyles 列舉和ISelectionRenderer介面。如果你需要關於選擇設定的更多資訊,請參閱FpSpread類中的SelectionRenderer屬性和RetainSelectionBlock屬性.

下面的示例程式碼使用renderer設定和顏色對選擇的高亮顯示進行了設定。

// Use the selection renderer and colors. fpSpread1.Sheets[0].SelectionStyle = FarPoint.Win.Spread.SelectionStyles.Both; // Set the background and text colors.fpSpread1.Sheets[0].SelectionBackColor = System.Drawing.Color.AliceBlue; fpSpread1.Sheets[0].SelectionForeColor = System.Drawing.Color.Navy; 自定義撤消和恢復操作

你可以把撤銷/恢復功能新增到你的應用中,用來撤銷表單中被終端使用者執行的各種操作。你可以使用UndoAction類和另外一些特定的類來滿足不同使用者的行為。另外還有一個管理類用來記錄終端使用者的可以撤銷和恢復的行為。

SpreadView類和FpSpread類擁有AllowUndo和UndoManager屬性,這些屬性用來開啟和關閉撤銷/恢復特性,並返回UndoManager給相應的SpreadView例項。每一個SpreadView擁有自己的UndoManager。

 

行為分配

UndoAction類是一個繼承自Action的抽象類,該類中新增了一些新方法:Undo 和 SaveUndoState。同時,它從Action類中繼承了PerformAction方法。

你可以在SaveUndoState中新增程式碼用來儲存撤銷狀態的相關資訊(類的成員變數)。你可以在PerformAction中新增程式碼來執行行為。你可以在Undo中新增程式碼來恢復行為(使用變數中的撤銷狀態資訊)。

每一個繼承自UndoAction的類被設計為僅執行一個指定行為(例如,編輯一個單元格,調整列大小,移動一個區域等),並撤銷該行為。與執行該行為相關的資訊需要被傳入該物件的建構函式中,並且所有與撤銷該行為有關的資訊需要被儲存在SaveUndoState的實現中。一旦 UndoAction物件被建立,指定行為的變數將被固定(根據傳入建構函式中的變數)。例如,編輯sheet1中的A1單元格,並將值改變為“test”,將列B調整為24畫素,將區域C4:F6移動到A1:D:3等。並且只能使用指定的方法執行指定的行為。

管理行為

UndoManager類管理撤銷棧和恢復棧,它儲存著執行的行為和恢復的記錄及其順序。UndoAction必須要傳入到UndoManager中的PerformUndoAction方法,用來按順序執行該行為,並被UndoManager撤銷。當這種情況發生時,UndoManager將UndoAction壓進撤銷棧,並呼叫UndoAction中的PerformAction方法,然後CanUndo方法返回true(表明有行為需要撤銷)。如果CanUndo返回的是false,這意味著撤銷棧是空的,並沒有行為準備好被撤銷。如果你的應用擁有編輯選單,你可以使用該方法使編輯選單中的撤銷選單失效。

當一個行為準備撤銷時,你可以呼叫UndoManager中的Undo方法,Undo方法將撤銷棧中頂部的行為移動到恢復棧中,並且呼叫該行為的Undo方法,然後CanRedo方法返回true(表明有行為需要恢復)。

如果CanRedo返回false,這意味著恢復棧是空的,並且沒有行為準備好被恢復。如果你的應用擁有編輯選單,你可能希望使用該方法使編輯選單中的恢復選單失效。

當一個行為準備恢復時,你可以呼叫UndoManager中的Redo方法,Undo方法將恢復棧中最近執行的行為移動到撤銷棧中,並且呼叫行為的Redo方法,然後CanUndo方法返回true(表明有行為需要恢復)。

當你呼叫UndoManager中的PerformAction方法時,你可以將一個UndoAction物件的序列傳給該方法,該方法將執行序列中的每一個行為,並記錄每一個行為以及行為被執行的順序。然後你可以呼叫Undo方法撤銷序列中的一些行為,並且每一個方法可以使用Redo方法來恢復(使用Undo方法可以再次撤銷)。

如果你呼叫PerformAction來執行一個新的行為,在恢復棧中掛起的行為將會被清除,並且CanRedo方法返回false(這意味著一旦你執行了一個新的行為,你將不能夠恢復你之前撤銷的任何行為)。這就是為什麼UndoManager中的PushUndo方法擁有一個標識,當行為被壓入撤銷棧時來詢問恢復棧是否需要被清空。

一些UndoAction類將會替換動作對映中的行為物件,所以這些行為將會通過UndoManager按路徑傳送並且成為可撤銷的。其他UndoAction類將不會成為動作對映的一部分,而是用在SheetView或者SpreadView程式碼中,使行為成為可撤銷的。

其他API補充

輸入對映包含新的條目將CTRL+Z 和 CTRL+Y組合鍵對映為相應的UndoAction和RedoAction行為物件。這些行為呼叫UndoManager中相應的Undo和Redo方法。

自定義使用者介面的影象

你可以自定義多種影象,並通過使用者介面選擇自定義的影象,應用並替代預設影象。可以自定義的影象包括:

1. 級聯(展開和摺疊)圖示

2. 篩選指示器

3. 排序指示器

4. 行選擇器

image

image

使用SpreadView類的GetImage 和 SetImage方法來設定使用者介面上這些部分的影象。這些影象的僅能在執行時設定,不支援在設計時設定。

如果你需要關於這些方法的一個示例,請參閱下述方法:

1. CollapseImage

2. CollapseImageDisabled

3. ExpandImage

4. ExpandImageDisabled

5. FilterActive

6. FilterActiveDisabled

7. FilterInactive

8. FilterInactiveDisabled

9. RowSelectorImage

10. RowSelectorImageDisabled

11. SortAscendingImage

12. SortAscendingImageDisabled

13. SortDescendingImage

14. SortDescendingImageDisabled

15. SortUnsortedImage

16. SortUnsortedImageDisabled

如果你需要將影象重新設定為Spread預設影象,你僅需要將SetImage方法中的影象值設定為空。

另外一種為篩選指示器和排序指示器設定影象的方法是重寫CellTypeColumnHeaderRenderer 類中的 PaintFilterIndicator 和 PaintSortIndicator 方法。

 

Spread for Windows Forms 5.0 中文版下載地址

附:Spread for Windows Forms高階主題系列文章

Spread for Windows Forms高階主題(1)---底層模型

Spread for Windows Forms高階主題(2)---理解單元格型別

Spread for Windows Forms高階主題(3)---理解單元格的編輯模式

相關文章