[C#] SourceGrid 2.0_ 翻譯

 

 

SourceGrid 2.0

下載來源和二進 - 825 KbDownload Source and Binary - 825 Kb

下載文件編寫 - 1.35 MBDownload Documentation - 1.35 MB

官方的 SourceGrid 網站Official SourceGrid Website

 

l         介紹

l         使用 SourceGrid

1.         工程和配置

2.         SourceGridMini (精簡版的。NET Framework支持)

3.         Controls

4.         Grid

5.         GridVirtual

l         VisualModel

l         DataModel

l         BehaviorModel

l         Cells(單元格)

l         Grid的結構

1.         列和行

2.         panels 面板

l         事件

l         ContextMenu(上下文菜單)

l         焦點和選擇

l         位置和範圍

l         性能

l         擴展

l         Screenshots(屏幕截圖)

l         如何使用

l         功能

l         重新寫您的 SourceGrid 代碼

l         未來發展

l         已知的問題

l         早先的版本

l         歷史

l         許可

介紹:

SourceGrid 是一個的完全地用C#開發的Windows窗體控件;我的目標是產生一個簡單的但是靈活的(網格)grid,每當使改變一個表格式的一系列的數據時必需是可見的。(注:顯示數據的需求)

有許多這系列的控件可以用, 但是時常是貴的(收註冊費等), 很難符合客戶需求,或者不是和.NET一致的(注:不受.NETframework支持)

微軟公司 DataGrid 不容易根據客戶的需求定製(相信和我一樣很多人遇到同樣的問題了),當他的數據源不是DataSet時通常顯得比較複雜,難使用!

我想要謝謝 Chirs Beckett, Anthony Berglas, Wayne Tanner, Ernesto Perales, Vadim Katsman, Jeffery Bell, Gmonkey, cmwalolo, Kenedy, zeromus, Darko Damjanovic, John Pierre, Achim Schäfer, Michael Look, Elmü (http://kickme.to/elmue)  和幫我解決了編碼,Bug和給我新的主意和提議的許多其他的人。

在此對我已經用產生 CHM 幫忙的 NDoc 的表示特別謝謝。

 

這個控件與微軟公司的Microsoft Framework. NET 1.1一起編譯。並且引用SourceLibrary.dll 1.2.3.1, 這是個通常的功能集的一個小的庫。 我在ZIP 文件裏介紹了的這一個動態鏈接庫, 但是最好下載來自位置 http:// www.devage.com/. 的整個源碼和最近的版本dll;使用條件:Visual Studio .NET 2003  或其它兼容的開發環境。。

 

最新版的控件從 http:// www.devage.com/.下載

如果你有問題,可以給我發郵件:[email protected]

 

在這篇文章中我想要介紹SourceGrid的概觀和其功能性。

因爲關於類,特性或方法的細節你能以 CHM 的格式幫助文件裏獲取 ZIP 文件的示例工程。

使用 SourceGrid

工程和配置

在附上的文件中有 4個工程:

 

l         SourceGrid(SourceGrid2.dll)- .NET Framework下的主工程

l         SampleProject- .NET Framework下的示例工程

l         SourceGridMini(SourceGridMini.dll)-精簡版類庫下的SourceGrid(例如:PocketPC中使用該控件)

l         SampleProjectMini-精簡版類庫下的SourceGrid 示例

我已經建立 2 解決方案:

SourceGrid2.sln標準的版本Framework

     SourceGrid2Mini.sln 精簡版Framework

 

SourceGridMini 精簡版Framework支持

SourceGridMini SourceGrid 版本爲精簡結構。 這一個版本使用與正常的版本相同——除了由於一些條件下的代碼不被支持 (即:精簡版類庫不支持)

例如: 一些鼠標事件 (MouseEnter MouseLeave,..)

對於 SourceGridMini 仍然有許多工作要完成,我一定將圖畫最佳化方法並且進行必需的檢查並且測試許多功能最終產生穩定的工作版本。

 

我已經以Microsoft Pocket PC 2003 Emulator作爲測試平臺。

 

當你最初打開一個解決方案的時候(即:示例解決方案),將有一個錯誤,找不到SourceLibraryMini.dll,這是個引用問題……

要解決這個問題,你所要做的是首先刪除未找到的SourceLibraryMini.dll,接着找到SourceLibraryMini.dll的物理位置,再重新添加一次引用。

從現在開始文章涉及.NET Framework,但是大多數的代碼和一些解釋是針對精簡版類庫的,,未來我將會試着區別二個版本。

 


控件

SourceGrid2.dll有裏面的 2 控件能在VS.NET的工具箱中被插入,且在任何窗體中被使用:

GridVirtual 一個虛擬單元格組成的網格

Grid - 一個真正的單元格組成網格.

因此那裏是二個基本上清楚的物件: 虛擬表格和真實表格。

虛擬的表格是決定外表和單元格的行爲但是不包含數值。

真正的表格有如同虛擬表格一般的特性但是也包含表格的數值, 而且因此被關聯到到網格的一個特定的位置。

 

 

 

每個單元格由三個基本部份組成:

 

DataModel: DataModel 是處理單元格的數值的類。它將單元格的數值轉換成一個字串使其可視化,產生單元格的編輯、驗證插入的值等操作。

VisualModel: VisualModel繪製單元格的類,包含可視的屬性

BehaviorModel : BehaviorModel 是提供單元格的行爲的類。

 

這一個細分允許很棒的彈性代碼的再可用性, 節省時間而且爲每一用戶定製的類型提供堅實的基礎。。

通常的說,現在已經有一些類安排而且配置好, 你只需要使用很少的一些程序編碼就有可能產生符合你要求的個人化的單元格。 (爲明細見到下一個段落)

 

網格(Grid

如果你想要最好的彈性和簡單性,網格(Grid)控件是最理想的除了沒有許多單元格之外。事實上,在這控件中,每個單元格都被表現被一個類來表示,並且因此佔領一個資源的特定量。 而且這是唯一的支持 RowSpan ColumnSpan 的功能網格(Grid.(單元格合併)

 

在窗體中插入控件之後,我們就能馬上開始寫我們的使用網格(Grid)的編碼了。

舉例來說在窗體的加載事件中我們能寫這樣的代碼:

grid1.Redim(2, 2);
grid1[0,0] = new SourceGrid2.Cells.Real.Cell("Hello from Cell 0,0");
grid1[1,0] = new SourceGrid2.Cells.Real.Cell("Hello from Cell 1,0");
grid1[0,1] = new SourceGrid2.Cells.Real.Cell("Hello from Cell 0,1");
grid1[1,1] = new SourceGrid2.Cells.Real.Cell("Hello from Cell 1,1");

 

第一行代碼用 2個行和 2個列產生一個表而且用一個單元格放置在每個位置。 我已經使用 SourceGrid2.Cells.Real 名稱空間,它包含了真正的單元格的定義。

 

每個單元格包含了所有的必需的顯示屬性

舉例來說;包含改變單元格背景顏色:(由我們自定義)

SourceGrid2.Cells.Real.Cell l_Cell = new SourceGrid2.Cells.Real.Cell("Custom back color");
l_Cell.BackColor = Color.LightGreen;

 

這些是單元格的主要視覺特性:(對於一個整個的列表請教網格(Grid)的文檔) BackColor, ForeColor, Border, Font, TextAlignment, WordWrap ...,

 

現在我們試着創建整個的網格(Grid,有表頭、自動排序、根據鼠標或者字符串調整列的寬度,並且有日期和一個選擇框

 

grid1.BorderStyle = BorderStyle.FixedSingle;
grid1.ColumnsCount = 3;
grid1.FixedRows = 1;
grid1.Rows.Insert(0);
grid1[0,0] = new SourceGrid2.Cells.Real.ColumnHeader("String");
grid1[0,1] = new SourceGrid2.Cells.Real.ColumnHeader("DateTime");
grid1[0,2] = new SourceGrid2.Cells.Real.ColumnHeader("CheckBox");
for (int r = 1; r < 10; r++)
{
        grid1.Rows.Insert(r);
        grid1[r,0] = new SourceGrid2.Cells.Real.Cell("Hello " + r.ToString(), typeof(string));
        grid1[r,1] = new SourceGrid2.Cells.Real.Cell(DateTime.Today, typeof(DateTime));
        grid1[r,2] = new SourceGrid2.Cells.Real.CheckBox(true);
}
grid1.AutoSizeAll();

 

在前面的碼中我已經設定了網格(Grid)邊緣,列的數目,固定行的數目而且創造了第一個表頭行。 對於表頭我已經用一個 ColumnHeader 單元格。 藉由一個簡單的循環我已經建立使用不同類型的每個列的其他單元格。單元格類別自動地爲被指定。 ( 在這情況下即一個本文框和 DateTimePicker) 對於最後一個列我已經用一個在單元格中直接地允許勾選欄顯示的勾選欄單元格。

窗體應該看起來像下列的截圖那個一樣。 這一個例子在 ZIP 文件的工程 SampleProject 中也是有的。

 

你可以使用這樣的語句獲取單元格的值:object val = grid1[1,0].Value;.

 

GridVirtual

當需要用許多地單元格將一些數據呈現出來的時候, GridVirtual 控件是理想的;通常你已經有可得的結構化的數據,像DataSet、一個數據組的數據,一個行列,一個XML文件或其他的數據結構。

網格(Grid)控件除了自動的排序 ( 這因爲網格(Grid)沒有拷貝不能夠自動地排序任何的外部數據結構的內容) 單元格合併,允許生成的單元格跨越相鄰的單元格

(汗:英語水平太爛,此處翻譯感覺不行……)

另外的缺點是創造一個虛擬的網格(Grid)稍微更困難。

 

一個虛擬的網格(Grid)主要的觀念是單元格不包含數值, 但是讀寫來自一個外部的數據結構的數值。 這一個思想和抽象的類別 CellVirtual 一起,它必需重新實現定義的方法 GetValue SetValue

使用它因此是必需產生一個衍生於 CellVirtual 的類,並且自定義讀取數據源的數據;

它也通常是比較好產生於 GridVirtual ,而且爲了要有比較棒的彈性和較多的固定代碼 , 重載方法 GetCell 的控件。

如果你偏愛你能直接地使用 GridVirtual 控件並且使用事件 GettingCell 方法 GetCell 的目的或事件 GettingCell 對於一個給定的位置 (列和欄) 是返回被選擇的單元格。 因爲你能爲一個特定的類型返回任何的 ICellVirtual ,所以這允許很棒的彈性;

當列是 0 的時候,舉例來說你可以返回一個類型表頭的單元格。

 

在下列的例子中我已經建立一個讀寫由數組存儲數值的虛擬的網格(Grid)。 首先我已經在窗體中插入控件 GridVirtual,。然後我再寫定義虛擬的類繼承從 CellVirtual :

public class CellStringArray : SourceGrid2.Cells.Virtual.CellVirtual
{
         private string[,] m_Array;
         public CellStringArray(string[,] p_Array):base(typeof(string))
         {
                 m_Array = p_Array;
         }
         public override object GetValue(SourceGrid2.Position p_Position)
         {
                 return m_Array[p_Position.Row, p_Position.Column];
         }
         public override void SetValue(SourceGrid2.Position p_Position, object p_Value)
         {
                  m_Array[p_Position.Row, p_Position.Column] = (string)p_Value;
                 OnValueChanged(new SourceGrid2.PositionEventArgs(p_Position, this));
         }
}

 

在早先的碼中我已經創建了一個虛擬單元格,讀寫存儲在數組裏的值,當調用SetValue方法之後,我們接着調用OnValueChanged方法提醒grid更新這個單元格。

 

在窗體的加載事件中我插入這一個代碼:

 

 

private void frmSample15_Load(object sender, System.EventArgs e)
{
        gridVirtual1.GettingCell += new SourceGrid2.PositionEventHandler(gridVirtual1_GettingCell);
        gridVirtual1.Redim(1000,1000);
        string[,] l_Array = new string[gridVirtual1.RowsCount, gridVirtual1.ColumnsCount];
        m_CellStringArray = new CellStringArray(l_Array);
        m_CellStringArray.BindToGrid(gridVirtual1);
}

 

我已經把一個事件處理程式加入 GettingCell 事件,又由1000個列和 1000個欄建立網格(Grid)和數組, 建立先前定義的虛擬單元格的一個新實例 CellStringArray ,而且由方法 BindToGrid 我已經把單元格和網格(Grid)相連。

我已經建立一個單一虛擬的單元格, m_CellStringArray,那將會作爲點陣式的每個位置。 我們總是必需調用在我們想要在一個虛擬的網格(Grid)中使用的單元格上的方法 BindToGrid

 

爲了要完成這個程序,我們應該爲單元格寫方法 GettingCell 而且儲存變數:

private CellStringArray m_CellStringArray;
private void gridVirtual1_GettingCell(object sender, SourceGrid2.PositionEventArgs e)
{
        e.Cell = m_CellStringArray;
}

 

結果應該看起來像下列的圖片那一個一樣。 這一個例子也在被包含在 ZIP 文件之中的工程 SampleProject 中。

 

 

VisualModel

Namespace: SourceGrid2.VisualModels

 

每個單元格有VisualModel 屬性,返回一個類型IVisualModel的接口。

單元格使用這一個接口繪圖並且使單元格的視覺特性符合客戶需求。

 

VisualModel的目的是將繪圖和其它部分的代碼分離並且允許在單元格之間的相同視覺的模型共享。 事實上 VisualModel 的相同實例同時地能在許多單元格上被用,這將系統的資源使用最佳化。

然而, 默認的 VisualModel類是隻讀的,每 VisualModel具有一個允許你產生相同的模型同一實例的複製方法。

 

以下是默認的 VisualModel 在名稱空間SourceGrid2.VisualModels 下的類別:

 

SourceGrid2.VisualModels.Common能自定義顏色,字型,邊緣

SourceGrid2.VisualModels.CheckBox *爲勾選欄用設計單元格。 勾選欄能被選擇, 設置爲無效而且能包含一個說明。

SourceGrid2.VisualModels.Header *爲表頭用以 3D立體邊緣設計單元格。

SourceGrid2.VisualModels.MultiImages允許單元格的超過一個圖像的圖畫。

 -

 *與一個星號一起作記號的 VisualModel 需要一個特別的接口才能正確地工作,

舉例來說勾選欄模型需要一個支援 ICellCheckBox 接口的單元格。

 

每一個這些類別都包含一個或多個方便的只讀實例的靜態的特性

 

  • SourceGrid2.VisualModels.Common.Default
  • SourceGrid2.VisualModels.Common.LinkStyle
  • SourceGrid2.VisualModels.CheckBox.Default
  • SourceGrid2.VisualModels.CheckBox.MiddleLeftAlign
  • SourceGrid2.VisualModels.Header.Default
  • SourceGrid2.VisualModels.Header.ColumnHeader
  • SourceGrid2.VisualModels.Header.RowHeader

這一個碼錶示該如何分配相同的 VisualModel 到較多的先前創建的單元格然後改變一些特性:

 

SourceGrid2.VisualModels.Common l_SharedVisualModel = new SourceGrid2.VisualModels.Common();
grid1[0,0].VisualModel = l_SharedVisualModel;
grid1[1,0].VisualModel = l_SharedVisualModel;
grid1[2,0].VisualModel = l_SharedVisualModel;
l_SharedVisualModel.BackColor = Color.LightGray;

 

也考慮當你寫Cell.BackColor特性自動地調用 VisualModel BackColor 特性。

爲了更便利的使用通常的一些屬性,當你寫諸這樣的代碼時:Cell.BackColor = Color.Black;  單元格自動地再一次到複製目前的 VisualModel, backcolor 換成複製的實例而且分配複製的實例。

 

 

 

DataModel

Namespace: SourceGrid2.DataModels

用格式化的字符串來表示一個單元格的值時,通常是必須組裝單元格DataModel的屬性

如果屬性爲空,是不能改變單元格的值

 

通常 DataModel 使用被請求的類型的 TypeConverter 處理必需的變換, 特別地字串變換.(過去一直表現單元格數值)

 

以下是名稱空間SourceGrid2.DataModels:的默認的DataModel:

 

DataModelBase提供轉換的方法,僅允許通過代碼修改單元格的值;它不供應繪畫接口。

EditorControlBase :抽象類,幫助使用類似於單元格的編輯控件

EditorTextBox -一個本文框編者。

EditorComboBox

EditorDateTime

EditorNumericUpDown

EditorTextBoxButton有一個按鈕的一個本文框編者開啓一種明細窗體

EditorUITypeEditor提供有 UITypeEditor 的所有類型的單元格編輯。許多類型支援這一個類別: DateTime Fontenum,.。。

 

一種DataModel

可以被許多單元格共享,就像爲單元格的每一列使用相同的DataModel

 

產生一個可編輯的單元格有3種方法:

 

·                1grid1[0,0] = new SourceGrid2.Cells.Real.Cell("Hello", typeof(string));
·           2 SourceGrid2.DataModels.IDataModel l_SharedDataModel =
     SourceGrid2.Utility.CreateDataModel(typeof(string));
     grid1[0,0].DataModel = l_SharedDataModel;
     grid1[1,0].DataModel = l_SharedDataModel;
·                3SourceGrid2.DataModels.EditorTextBox l_TextBox =
      new SourceGrid2.DataModels.EditorTextBox(typeof(string));
     grid1[2,0].DataModel = l_TextBox;

這一個方法是可能共享在許多單元格之間的相同編輯器。

……(省略一段)

 

當然用訂製的控件或特別的行爲產生一個訂製的 DataModel 編輯器是可能的。

下列的圖片表示可得的大部份的編輯器和像圖像特性一樣的一些選擇項:

SourceGrid2_CellTypes.jpg 

 

BehaviorModel

Namespace: SourceGrid2.BehaviorModels

每個單元格都有一個BehaviorModel的集合,你可以使用Behaviors屬性進行讀取操作

BehaviorModel 是一個表示單元格的行爲特色的類。 一個模型能在許多單元格之間被共享並且對任何新的功能的加入提供很好的彈性和簡單性;

 

這些是類型 BehaviorModel 的默認類別:

 

SourceGrid2.BehaviorModels.Common 通常行爲。

SourceGrid2.BehaviorModels.Header表頭的行爲。

SourceGrid2.BehaviorModels.RowHeader一個行表頭的行爲, 由於調整~大小功能。

SourceGrid2.BehaviorModels.ColumnHeader- 一個欄表頭的行爲, 藉由分類而且調整~大小功能。 (需要 ICellSortableHeader接口)

SourceGrid2.BehaviorModels.CheckBox* - 一個勾選欄的行爲。 (需要 ICellCheckBox)

SourceGrid2.BehaviorModels.Cursor*- 允許對一個特定的單元格一個光標的關聯。 (需要 ICellCursor)

SourceGrid2.BehaviorModels.Button  -一個按鈕的行爲。

SourceGrid2.BehaviorModels.Resize - 允許一個單元格與鼠標一起調整~大小.( 這一個模型自動地被表頭模型用)

SourceGrid2.BehaviorModels.ToolTipText*   ToolTipText 和一個單元格相連。 (需要 ICellToolTipText)

SourceGrid2.BehaviorModels.Unselectable  區塊從收到焦點的一個單元格。

SourceGrid2.BehaviorModels.ContextMenu*- contextmenu 的成績和一個單元格相連。 (需要 ICellContextMenu)

SourceGrid2.BehaviorModels.CustomEvents

SourceGrid2.BehaviorModels.BindProperty

SourceGrid2.BehaviorModels.BehaviorModelGroup

 

*與一個星號一起作記號的 BehaviorModel 需要特別的接口完成他們的任務,

舉例來說類別勾選欄需要單元格支持接口 ICellCheckBox

 

每個類別有一些靜態的特性返回類別的一個默認實例:

  • SourceGrid2.BehaviorModels.Common.Default
  • SourceGrid2.BehaviorModels.Button.Default
  • SourceGrid2.BehaviorModels.CheckBox.Default
  • SourceGrid2.BehaviorModels.ColumnHeader.SortHeader
  • SourceGrid2.BehaviorModels.ColumnHeader.ResizeHeader
  • SourceGrid2.BehaviorModels.ColumnHeader.SortResizeHeader
  • SourceGrid2.BehaviorModels.ColumnHeader.NoSortNoResizeHeader
  • SourceGrid2.BehaviorModels.ColumnHeader.Default
  • SourceGrid2.BehaviorModels.Cursor.Default
  • SourceGrid2.BehaviorModels.Header.Default
  • SourceGrid2.BehaviorModels.Resize.ResizeHeight
  • SourceGrid2.BehaviorModels.Resize.ResizeWidth
  • SourceGrid2.BehaviorModels.Resize.ResizeBoth
  • SourceGrid2.BehaviorModels.RowHeader.Default
  • SourceGrid2.BehaviorModels.ToolTipText.Default
  • SourceGrid2.BehaviorModels.Unselectable

在下列的碼中當使用者在單元格之上移動鼠標的時候,我產生改變單元格的 backcolor BehaviorModel 的例子

 

public class CustomBehavior : SourceGrid2.BehaviorModels.BehaviorModelGroup

{

         public override void OnMouseEnter(SourceGrid2.PositionEventArgs e)

         {

                 base.OnMouseEnter (e);

                 ((SourceGrid2.Cells.Real.Cell)e.Cell).BackColor = Color.LightGreen;

         }

         public override void OnMouseLeave(SourceGrid2.PositionEventArgs e)

         {

                 base.OnMouseLeave (e);

                 ((SourceGrid2.Cells.Real.Cell)e.Cell).BackColor = Color.White;

         }

}

//在窗體的加載事件中插入代碼

grid1.Redim(2,2);
 
CustomBehavior l_Behavior = new CustomBehavior();
for (int r = 0; r < grid1.RowsCount; r++)
         for (int c = 0; c < grid1.ColumnsCount; c++)
         {
                 grid1[r,c] = new SourceGrid2.Cells.Real.Cell("Hello");
                 grid1[r,c].Behaviors.Add(l_Behavior);
         }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章