Previous topicNext topic
Help > 开发指南 > 预备知识 >
如何引用窗体

在我们的平台中,所有的表都是依附在窗体之下的。找到了窗体自然就可以方便地找到表了。根据使用场景不同,引用表的方式也可以不同。主要有以下几种获得窗体引用的方法。

1、直接获得窗体对象。Proj.Forms返回的是当前系统中所有的自定义窗体、下拉窗体、衍生窗体的集合。我们只需要通过Proj.Forms(strFormName)即可获得相应的窗体。如果此窗体没有被初始化,在引用后自动初始化。如果此窗体被打开过,也可以直接获得此被打开的窗体对象。

2、引用已经打开的窗体。Proj.OpenedForms可以访问当前系统中已经打开过的窗体。

窗体引用

 Vb.Net
Dim strFormName As String="窗体名称"
'第一种根据窗体名称直接获得窗体对象,此方法无视窗体是否被打开
Dim frm As SmForm=Proj.Forms(strFormName)

'第二种通过Proj.OpenedForms访问已经打开的窗体。
If Proj.OpenedForms.Contains(strFormName) Then
    frm=Proj.OpenedForms(strFormName)
End If

'第三种根据窗体创建一个新的窗体,并以新名称、新标题命名,这样就可以依据窗体模板复用窗体,避免重复编码
frm=Proj.Forms.CreateNewFormByName(strFormName,True)
frm.Name="新窗体名称"
frm.Text="新窗体标题"

'第四种,因为下拉窗体比较特殊,得通过特殊的方法获得
Dim frmDropDown As DropDownForm=Proj.Forms.GetDropDownForm(strFormName,True)

 C#
string strFormName = "窗体名称";
// 第一种根据窗体名称直接获得窗体对象,此方法无视窗体是否被打开
SmForm frm = Proj.Forms[strFormName];

// 第二种通过Proj.OpenedForms访问已经打开的窗体。
if (Proj.OpenedForms.Contains(strFormName))
    frm = Proj.OpenedForms[strFormName];

// 第三种根据窗体创建一个新的窗体,并以新名称、新标题命名,这样就可以依据窗体模板复用窗体,避免重复编码
frm = Proj.Forms.CreateNewFormByName(strFormName, true);
frm.Name = "新窗体名称";
frm.Text = "新窗体标题";

// 第四种,因为下拉窗体比较特殊,得通过特殊的方法获得
DropDownForm frmDropDown = Proj.Forms.GetDropDownForm(strFormName, true);

3、窗体事件中引用窗体。直接可以通过类的SmForm属性来访问窗体对象的引用。在Vb.net中就是Me.SmForm,而在C#中就是this.SmForm。

 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属性来访问已经加载的表
    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属性来访问已经加载的表
    SmGrid SmGrid1 = this.SmForm.Grids["SmGrid1"] as SmGrid;
}

4、通过表来引用窗体。所有表的基类BaseGrid有一个属性Form可以返回SmForm类型的对象。可以直接引用到表所属的窗体对象。

 VB.Net
Public Sub TestForm_Load(sender As Object,e As  System.EventArgs)
    Dim tbl As SmGrid=Me.SmForm.ControlDictionary()("SmGrid1")
    '根据表对象的Form属性来获得窗体的引用
    Dim frm As SmForm=tbl.Form
End Sub

C#
public void TestForm_Load(object sender, System.EventArgs e)
{
    // 引用表,窗体事件中的窗体可以直接通过this.SmForm来访问
    SmGrid tbl = this.SmForm.ControlDictionary()["SmGrid1"] as SmGrid;
    //根据表对象的Form属性来获得窗体的引用
    SmForm frm=tbl.Form;
}

5、通过控件来引用窗体。本平台中为Control类添加了一个Form()扩展方法,可以获得当前控件所属的窗体。此方法返回的是一个BaseForm类型,此类型为SmForm类的基类,我们可以直接

Vb.Net
Public Sub SmTextBox1_ValueChanged(sender As Object,e As  System.EventArgs)
    '通过sender对象获得控件引用
    Dim txtName As SmTextBox=sender
    '通过Form扩展方法获得窗体的引用
    Dim frm As SmForm=txtName.Form()
End Sub

C#
public void SmTextBox1_ValueChanged(object sender, System.EventArgs e)
{
    //通过sender对象获得控件引用
    SmTextBox txtName=sender as SmTextBox;
    //通过Form扩展方法获得窗体的引用
    SmForm frm=txtName.Form() as SmForm;
}

窗体打开的代码示例可以参考“打开窗体”。