我們平臺(tái)在數(shù)據(jù)處理方面基本是圍繞著表的。可以參考“SmGrid”,SmGrid已經(jīng)將我們平臺(tái)中主要的數(shù)據(jù)處理對(duì)象全部關(guān)聯(lián)了。我們?cè)诖a編寫過程中,如果可以正確引用到對(duì)應(yīng)的表,那么就可以隨意地操縱數(shù)據(jù)了。
我們?cè)诓煌牡胤揭帽淼姆绞讲灰粯?。下面我們就依次介紹不同地方引用表的方式。
1、表事件。無論是在全局表事件,還是在窗體表事件中,我們獲得表的方式都是相同的,就是通過事件參數(shù)中的sender來進(jìn)行轉(zhuǎn)換獲得。
VB語法:
Dim tbl As SmGrid=sender
C#語法:
SmGrid tbl=sender as SmGrid;


在窗體表事件中,我們需要定位到指定的事件中,然后在事件里面定義引用相應(yīng)的表。同時(shí)還要注意,我們平臺(tái)里面的表主要有兩種:SmGrid和SmEditTreeGrid。請(qǐng)根據(jù)實(shí)際的表類型定義表變量。

2、在窗體事件中引用表。在窗體的表事件中引用表可以直接用上面的方法。如果是在窗體事件或窗體其他控件的事件中該如何引用表呢?
主要有兩種,一種就是直接定位表,通過窗體中的Grids集合訪問到所有已經(jīng)加載的表。因?yàn)橹荒茉L問到已加載的表,那么沒有加載的時(shí)候自然就訪問不到了。所以特別注意窗體Load、AfterLoad事件不能使用此方法。
另外一種就是按照控件名稱引用,通過窗體中的ControlDictionary方法返回的控件字典來訪問。
VB.Net Public Sub TestForm_Load(sender As Object,e As System.EventArgs)
'引用表,窗體事件中的窗體可以直接通過Me.SmForm來訪問
Dim tbl As SmGrid=Me.SmForm.ControlDictionary()("SmGrid1")
End Sub
Public Sub SmTextBox1_ValueChanged(sender As Object,e As System.EventArgs)
'通過窗體的Grids屬性來訪問已經(jīng)加載的表
Dim SmGrid1 As SmGrid=Me.SmForm.Grids("SmGrid1")
End Sub
C# public void TestForm_Load(object sender, System.EventArgs e)
{
// 引用表,窗體事件中的窗體可以直接通過this.SmForm來訪問
SmGrid tbl = this.SmForm.ControlDictionary()["SmGrid1"] as SmGrid;
}
public void SmTextBox1_ValueChanged(object sender, System.EventArgs e)
{
// 通過窗體的Grids屬性來訪問已經(jīng)加載的表
SmGrid SmGrid1 = this.SmForm.Grids["SmGrid1"] as SmGrid;
}
3、窗體菜單事件。我們?cè)诒韺傩栽O(shè)置窗口中,可以自由地定義綁定表的窗體菜單。這些窗體菜單一般都是綁定固定的表的。我們可以通過這個(gè)窗體菜單來獲得對(duì)表的引用。
VB.Net '通過Proj.CurrentClickedCommandEventArgs靜態(tài)屬性獲得當(dāng)前按鈕Click事件的參數(shù)
Dim e As sanMuSoft.CS.WinForm.CommandClickEventArgs= Proj.CurrentClickedCommandEventArgs
'可以通過e參數(shù)來獲得菜單的命令鏈接C1CommandLink
e.CallerLink.Text="已審核"
'通過Proj.CurrentClickedGridMenu靜態(tài)屬性獲得當(dāng)前菜單
Dim menu As GridMenuBase= Proj.CurrentClickedGridMenu
'通過菜單綁定的表對(duì)象獲得表引用,請(qǐng)根據(jù)實(shí)際的表類型定義變量
Dim tbl As SmGrid=menu.BaseGrid
Dim tblTree As SmEditTreeGrid=menu.BaseGrid
tbl.Save()
C# |
// 通過Proj.CurrentClickedCommandEventArgs靜態(tài)屬性獲得當(dāng)前按鈕Click事件的參數(shù) sanMuSoft.CS.WinForm.CommandClickEventArgs e = Proj.CurrentClickedCommandEventArgs; // 可以通過e參數(shù)來獲得菜單的命令鏈接C1CommandLink e.CallerLink.Text = "已審核"; // 通過Proj.CurrentClickedGridMenu靜態(tài)屬性獲得當(dāng)前菜單 GridMenuBase menu = Proj.CurrentClickedGridMenu; // 通過菜單綁定的表對(duì)象獲得表引用,請(qǐng)根據(jù)實(shí)際的表類型定義變量 SmGrid tbl = menu.BaseGrid; SmEditTreeGrid tblTree = menu.BaseGrid; tbl.Save(); |
4、當(dāng)前表。Proj.CurrentGrid全局屬性返回的是當(dāng)前表,這個(gè)返回的是一個(gè)BaseGrid類型,所以它既可能返回SmGrid對(duì)象,也可能返回SmEditTreeGrid對(duì)象。當(dāng)我們點(diǎn)擊任意一個(gè)表時(shí),此時(shí)Proj.CurrentGrid就會(huì)指向此表對(duì)象。同時(shí)系統(tǒng)會(huì)觸發(fā)項(xiàng)目事件里面的CurrentGridChanged事件。
我們?cè)趯懘a的時(shí)候,為了訪問到具體的SmGrid對(duì)象中的屬性,如果直接使用Proj.CurrentGrid可能每次都要進(jìn)行類型轉(zhuǎn)換。所以我們同時(shí)提供了Proj.CurrentSmGrid屬性,這樣就不需要我們每次都進(jìn)行類型轉(zhuǎn)換了。但是,當(dāng)我們的當(dāng)前表是SmEditTreeGrid時(shí),此時(shí)Proj.CurrentSmGrid返回的是空值(VB.Net中是Nothing,C#中是null)。
5、直接定位表。我們可以通過Proj.OpenedForms("打開窗體名").Grids("tblMain")這種方式直接定位到已經(jīng)打開的某個(gè)窗口中的指定名稱的表。這種定位方式一定要注意指定的窗體必須已經(jīng)打開,對(duì)應(yīng)的表也加載了數(shù)據(jù)。SmForm.Grids屬性里面包含的都是已經(jīng)加載了數(shù)據(jù)的表集合。在窗體的Load、AfterLoad事件不可以用此方法引用表,因?yàn)檫@時(shí)候窗體可能還沒有打開并添加到OpenedForms集合中,表也還沒有正式加載。
VB.Net
Dim strFormName As String="窗體名"
Dim strTableName As String="tblMain"
'先判斷一下指定的窗體是否打開,再判斷一下指定的表是否加載。
'SmForm.Grids屬性里面包含的都是已經(jīng)加載了數(shù)據(jù)的表集合。
If Proj.OpenedForms.Contains(strFormName) AndAlso Proj.OpenedForms(strFormName).Grids.Contains(strTableName) Then
'直接根據(jù)打開窗體定位表。
Dim tbl As SmGrid=Proj.OpenedForms(strFormName).Grids(strTableName)
tbl.Save()
End If
C# |
string strFormName = "窗體名"; string strTableName = "tblMain"; // 先判斷一下指定的窗體是否打開,再判斷一下指定的表是否加載。 // SmForm.Grids屬性里面包含的都是已經(jīng)加載了數(shù)據(jù)的表集合。 if (Proj.OpenedForms.Contains(strFormName) && Proj.OpenedForms[strFormName].Grids.Contains(strTableName)) { // 直接根據(jù)打開窗體定位表。 SmGrid tbl = Proj.OpenedForms[strFormName].Grids[strTableName]; tbl.Save(); } |
6、引用父表。IDataRuleGrid接口中有Relation屬性,通過Relation屬性的ParentGrid屬性可以訪問到父表對(duì)象。正常情況下SmGrid和SmEditTreeGrid是實(shí)現(xiàn)了IDataRuleGrid接口的,可以直接訪問父表。
VB.Net |
Dim tbl As SmGrid=Proj.CurrentSmGrid '如果主表是SmGrid類型 Dim tblMain As SmGrid= tbl.Relation.ParentGrid '如果主表是SmEditTreeGrid類型 Dim tblEditTree As SmEditTreeGrid=tbl.Relation.ParentGrid |
C#
SmGrid tbl = Proj.CurrentSmGrid;
// 如果主表是SmGrid類型
SmGrid tblMain = tbl.Relation.ParentGrid as SmGrid;
// 如果主表是SmEditTreeGrid類型
SmEditTreeGrid tblEditTree = tbl.Relation.ParentGrid as SmEditTreeGrid;
7、引用子表。IDataRuleGrid接口中的Relation屬性還有一個(gè)ChildrenGrids屬性,可以訪問到對(duì)應(yīng)的所有子表。
VB.Net |
Dim tbl As SmGrid=Proj.CurrentSmGrid '遍歷當(dāng)前表的所有子表 For Each tblSub As IDataRuleGrid In tbl.Relation.ChildrenGrids '模式一:遍歷子表所能看到的數(shù)據(jù)集合 For Each dr As RowData In tblSub.View.ViewRows Next '模式二:遍歷子表所有數(shù)據(jù)集合 For Each dr As RowData In tblSub.DataTableHelp.DataRows Next Next '根據(jù)序號(hào)獲取指定的子表 Dim tblSub01 As SmGrid=tbl.Relation.ChildrenGrids(0) '第一個(gè)子表 '根據(jù)子表名稱來獲取指定的子表 Dim tblSub02 As SmGrid=tbl.Relation.ChildrenGrids("tbl_vwEmployeeFamilyMember") |
C# |
SmGrid tbl = Proj.CurrentSmGrid; // 遍歷當(dāng)前表的所有子表 foreach (IDataRuleGrid tblSub in tbl.Relation.ChildrenGrids) { // 模式一:遍歷子表所能看到的數(shù)據(jù)集合 foreach (RowData dr in tblSub.View.ViewRows) { } // 模式二:遍歷子表所有數(shù)據(jù)集合 foreach (RowData dr in tblSub.DataTableHelp.DataRows) { } } // 根據(jù)序號(hào)獲取指定的子表 SmGrid tblSub01 = tbl.Relation.ChildrenGrids[0] as SmGrid; // 第一個(gè)子表 // 根據(jù)子表名稱來獲取指定的子表 SmGrid tblSub02 = tbl.Relation.ChildrenGrids["tbl_vwEmployeeFamilyMember"] as SmGrid; |
8、引用副表。什么是副表?我們知道,主窗口下面可以顯示對(duì)應(yīng)的子表,但是在彈出的子窗口中我們同樣可以顯示對(duì)應(yīng)的子表。在觀感上,下面的子表是雙份的。我們修改了任何子表中的數(shù)據(jù),另外的表中數(shù)據(jù)也會(huì)跟著同步更新顯示。我們說,子窗口中的子表是主窗口中的子表的副表。他們都同時(shí)綁定的相同的TableBindingSource。
原則上,同一個(gè)源表,我們可以綁定到多個(gè)副表,綁定也非常簡單,只需要SmGrid.SourceSmGrid=tblSource即可。
Vb.Net |
Dim tbl As SmGrid=Proj.CurrentSmGrid '如果當(dāng)前表是副表 If tbl.IsCopyGrid Then '判斷當(dāng)前表是否副表 '如果是副表,可以通過SourceSmGrid屬性來獲得對(duì)源表的引用 Dim tblMain As SmGrid= tbl.SourceSmGrid End If '如果當(dāng)前表有對(duì)應(yīng)的副表 If tbl.CopyGrids.Count>0 Then '遍歷所有副表 For Each tb As BaseGrid In tbl.CopyGrids '結(jié)束編輯 tb.EndEdit() Next End If |
C# |
SmGrid tbl = Proj.CurrentSmGrid; // 如果當(dāng)前表是副表 if (tbl.IsCopyGrid) //判斷當(dāng)前表是否副表 { // 如果是副表,可以通過SourceSmGrid屬性來獲得對(duì)源表的引用 SmGrid tblMain = tbl.SourceSmGrid; } // 如果當(dāng)前表有對(duì)應(yīng)的副表 if (tbl.CopyGrids.Count > 0) { // 遍歷所有副表 foreach (BaseGrid tb in tbl.CopyGrids) { // 結(jié)束編輯 tb.EndEdit(); } } |