Previous topicNext topic
Help > 开发指南 > 窗体开发 > 控件参考 > SmDropDownForm(下拉窗口) >
下拉窗体示例一

我们有时候需要一些平台中数据规范没有给出下拉窗体效果。那么如何自定义一个下拉窗口,最后又如何在控件中、表格中使用此下拉窗口呢?下面我们就以一个完整的示例来展示一下。

第一步:创建一个下拉窗体,然后根据需要拖动相应的控件到设计窗体上。

第二步:修改表的名称为tblMain;给GridFilter1控件绑定到tblMain;给BaseGridMenu1控件绑定到tblMain

第三步:分别给相应的事件写代码。

Vb.Net
Imports System
Imports System.Text
Imports System.IO
Imports System.Data
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Drawing.Imaging
Imports System.Drawing.Text
Imports System.Diagnostics
Imports System.Collections
Imports System.Collections.Generic
Imports System.Runtime.InteropServices
Imports System.Collections.Specialized
Imports System.Windows.Forms
Imports System.Reflection
Imports Microsoft.CSharp
Imports Microsoft.VisualBasic
Imports sanMuSoft.Utility
Imports sanMuSoft.Data.Pivot
Imports System.Linq
Imports System.Threading
Imports System.Threading.Tasks
Imports System.Xml
Imports System.Data.Common
Imports System.Net.Http
Imports C1.C1Excel
Imports C1.C1Zip
Imports C1.Win.C1Command
Imports C1.Win.C1FlexGrid
Imports C1.Win.C1Input
Imports C1.Win.C1Ribbon
Imports C1.Win.C1Themes
Imports sanMuSoft.CS.Framework
Imports sanMuSoft.CS.Framework.Editor
Imports sanMuSoft.CS.Framework.FormDesigner
Imports sanMuSoft.CS.Framework.DropDownForms
Imports sanMuSoft.CS.WinForm
Imports sanMuSoft.CS.WinForm.Editor
Imports sanMuSoft.CS.WinForm.Controls
Imports sanMuSoft.CS.WinForm.Controls.Grid
Imports sanMuSoft.CS.WinForm.Controls.BoxControls
Imports sanMuSoft.CS.Workflow
Imports sanMuSoft.CS.Report
Imports sanMuSoft.Data
Imports sanMuSoft.Data.TableBuilder
Imports sanMuSoft.CS.ShareFunc
Imports Newtonsoft.Json.Linq
Imports Newtonsoft.Json
Imports Aliyun.OSS

Namespace FormEvents
    Public Class Forma830cec848684f6c9746bf0fbf468ea3
        Inherits DropDownFormEventsBase
        
        '设置一个私有字段,存储当前表数据是否加载的状态
        Private m_isDataLoaded As Boolean=False
        '设置一个私有字段来保存对表格的引用,方便在各个事件之间直接引用表
        Private m_tblMain As SmGrid
        
        Public Sub 下拉窗体示例_Load(sender As Object,e As  System.EventArgs)
            Dim GridFilter1 As GridFilter=Me.SmDropDownForm.ControlDictionary()("GridFilter1")
            '设置简单筛选的筛选条件
            GridFilter1.FilterString="FullName like '%{0}%'"
        End Sub
        
        Public Sub 下拉窗体示例_Open(sender As Object,e As  System.EventArgs)
            Dim tblMain As SmGrid=Me.SmDropDownForm.ControlDictionary()("tblMain")
            '如果表数据没有加载过,则在这里通过代码加载表数据,Open事件会执行多次,保证数据只初始化一次
            If tblMain.DataTableHelp Is Nothing Then
                '给私有字段赋值
                m_tblMain=tblMain
                Dim strSQLcmd As String="Select EmployeeID,FullName,IDNumber,Gender,PoliticalStatus,CurrentAddress,blnDelete From EmployeeInfo Where blnDelete=0 OR blnDelete is null"
                tblMain.Fill(strSQLcmd,"UserDB",False,True)
                '下面的代码可写可不写,根据自己的需要
                tblMain.LoadColInputRule()
                tblMain.BuildCaption("",Proj.SysDataFactory("UserDB"))
                tblMain.SetVisibleWidth()
            End If
            
            '如果有需要,我们可以判断当前是否是第二次打开,是否需要重新加载表数据
            If m_isDataLoaded Then
                tblMain.DataTableHelp.LoadFilter="blnDelete=0 OR blnDelete is null"
                tblMain.DataTableHelp.Load()
            End If
            
            '给数据加载的状态赋值,让上面的程序知道是不是第一次执行此段代码,要不要重新刷新数据。
            '这里的状态重复赋值不影响代码执行结果。
            m_isDataLoaded=True
        End Sub
        
        Public Sub 下拉窗体示例_PostChanges(sender As Object,e As  System.EventArgs)
            '最后我们在下拉窗体关闭时将结果赋值给控件
            If m_tblMain.CurrentRowData IsNot Nothing Then '如果当前行不为空
                '如果想将表中多列返回到其他表中的话,可以直接赋值
'               Dim drSource As RowData= Proj.OpenedForms("员工管理").Grids("tblMain").CurrentRowData
'               If drSource IsNot Nothing Then
'                   drSource("EmployeeID")=m_tblMain.CurrentRowData("EmployeeID")
'                   drSource("FullName")=m_tblMain.CurrentRowData("FullName")
'                   drSource("IDNumber")=m_tblMain.CurrentRowData("IDNumber")
'               End If
                
                '如果是只返回到下拉框控件中的话,直接给引用控件赋值,如果是直接给表中赋值,同样需要另外
                '给OwnerControl.Value赋值绑定的字段对应值。
                Me.SmDropDownForm.OwnerControl.Value=m_tblMain.CurrentRowData("EmployeeID")
            End If
        End Sub
        
        Public Sub 下拉窗体示例_OwnerControlTextChanged(sender As Object,e As  System.EventArgs)
            '我们可以根据控件输入文本的变化进行数据筛选
            If Me.SmDropDownForm.OwnerControl.DroppedDown Then '如果下拉窗口打开
                '如果是本地筛选
                If m_tblMain.IsNativeFilter Then
                    m_tblMain.View.Filter="FullName like '%{0}%'"
                Else '如果是后台筛选
                    m_tblMain.DataTableHelp.LoadFilter="(blnDelete=0 OR blnDelete is null) and FullName like '%{0}%'"
                    m_tblMain.DataTableHelp.Load()
                End If
            End If
        End Sub
        
        Public Sub tblMain_DoubleClick(sender As Object,e As  System.EventArgs)
            '如果当前下拉窗口正处于打开状态,则关闭下拉窗口
            If Me.SmDropDownForm.OwnerControl.DroppedDown Then
                '直接关闭下拉窗口会触发PostChanges事件,引发赋值的代码
                Me.SmDropDownForm.CloseDropDown(True)
                
            End If
        End Sub
        
        Public Sub tblMain_KeyDown(sender As Object,e As  System.Windows.Forms.KeyEventArgs)
            '如果回车就关闭当前下拉窗口
            If e.KeyCode=Keys.Enter Then
                '直接关闭下拉窗口会触发PostChanges事件,引发赋值的代码
                Me.SmDropDownForm.CloseDropDown(True)
            End If
        End Sub
    End Class
End Namespace

C#
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualBasic;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.Collections;
using System.Runtime.InteropServices;
using System.Collections.Specialized;
using System.Windows.Forms;
using Microsoft.CSharp;
using sanMuSoft.Utility;
using sanMuSoft.Data.Pivot;
using System.Threading;
using System.Xml;
using System.Data.Common;
using System.Net.Http;
using C1.C1Excel;
using C1.C1Zip;
using C1.Win.C1Command;
using C1.Win.C1FlexGrid;
using C1.Win.C1Input;
using C1.Win.C1Ribbon;
using C1.Win.C1Themes;
using sanMuSoft.CS.Framework;
using sanMuSoft.CS.Framework.Editor;
using sanMuSoft.CS.Framework.FormDesigner;
using sanMuSoft.CS.Framework.DropDownForms;
using sanMuSoft.CS.WinForm;
using sanMuSoft.CS.WinForm.Editor;
using sanMuSoft.CS.WinForm.Controls;
using sanMuSoft.CS.WinForm.Controls.Grid;
using sanMuSoft.CS.WinForm.Controls.BoxControls;
using sanMuSoft.CS.Workflow;
using sanMuSoft.CS.Report;
using sanMuSoft.Data;
using sanMuSoft.Data.TableBuilder;
using sanMuSoft.CS.ShareFunc;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using Aliyun.OSS;

namespace FormEvents
{
    public class Forma830cec848684f6c9746bf0fbf468ea3 : DropDownFormEventsBase
    {

        // 设置一个私有字段,存储当前表数据是否加载的状态
        private bool m_isDataLoaded = false;
        // 设置一个私有字段来保存对表格的引用,方便在各个事件之间直接引用表
        private SmGrid m_tblMain;

        public void 下拉窗体示例_Load(object sender, System.EventArgs e)
        {
            GridFilter GridFilter1 = this.SmDropDownForm.ControlDictionary()("GridFilter1");
            // 设置简单筛选的筛选条件
            GridFilter1.FilterString = "FullName like '%{0}%'";
        }

        public void 下拉窗体示例_Open(object sender, System.EventArgs e)
        {
            SmGrid tblMain = this.SmDropDownForm.ControlDictionary()("tblMain");
            // 如果表数据没有加载过,则在这里通过代码加载表数据,Open事件会执行多次,保证数据只初始化一次
            if (tblMain.DataTableHelp == null)
            {
                // 给私有字段赋值
                m_tblMain = tblMain;
                string strSQLcmd = "Select EmployeeID,FullName,IDNumber,Gender,PoliticalStatus,CurrentAddress,blnDelete From EmployeeInfo Where blnDelete=0 OR blnDelete is null";
                tblMain.Fill(strSQLcmd, "UserDB", false, true);
                // 下面的代码可写可不写,根据自己的需要
                tblMain.LoadColInputRule();
                tblMain.BuildCaption("", Proj.SysDataFactory["UserDB"]);
                tblMain.SetVisibleWidth();
            }

            // 如果有需要,我们可以判断当前是否是第二次打开,是否需要重新加载表数据
            if (m_isDataLoaded)
            {
                tblMain.DataTableHelp.LoadFilter = "blnDelete=0 OR blnDelete is null";
                tblMain.DataTableHelp.Load();
            }

            // 给数据加载的状态赋值,让上面的程序知道是不是第一次执行此段代码,要不要重新刷新数据。
            // 这里的状态重复赋值不影响代码执行结果。
            m_isDataLoaded = true;
        }

        public void 下拉窗体示例_PostChanges(object sender, System.EventArgs e)
        {
            // 最后我们在下拉窗体关闭时将结果赋值给控件
            if (m_tblMain.CurrentRowData != null)
                // 如果想将表中多列返回到其他表中的话,可以直接赋值
                // Dim drSource As RowData= Proj.OpenedForms("员工管理").Grids("tblMain").CurrentRowData
                // If drSource IsNot Nothing Then
                // drSource("EmployeeID")=m_tblMain.CurrentRowData("EmployeeID")
                // drSource("FullName")=m_tblMain.CurrentRowData("FullName")
                // drSource("IDNumber")=m_tblMain.CurrentRowData("IDNumber")
                // End If

                // 如果是只返回到下拉框控件中的话,直接给引用控件赋值,如果是直接给表中赋值,同样需要另外
                // 给OwnerControl.Value赋值绑定的字段对应值。
                this.SmDropDownForm.OwnerControl.Value = m_tblMain.CurrentRowData["EmployeeID"];
        }

        public void 下拉窗体示例_OwnerControlTextChanged(object sender, System.EventArgs e)
        {
            // 我们可以根据控件输入文本的变化进行数据筛选
            if (this.SmDropDownForm.OwnerControl.DroppedDown)
            {
                // 如果是本地筛选
                if (m_tblMain.IsNativeFilter)
                    m_tblMain.View.Filter = "FullName like '%{0}%'";
                else
                {
                    m_tblMain.DataTableHelp.LoadFilter = "(blnDelete=0 OR blnDelete is null) and FullName like '%{0}%'";
                    m_tblMain.DataTableHelp.Load();
                }
            }
        }

        public void tblMain_DoubleClick(object sender, System.EventArgs e)
        {
            // 如果当前下拉窗口正处于打开状态,则关闭下拉窗口
            if (this.SmDropDownForm.OwnerControl.DroppedDown)
                // 直接关闭下拉窗口会触发PostChanges事件,引发赋值的代码
                this.SmDropDownForm.CloseDropDown(true);
        }

        public void tblMain_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            // 如果回车就关闭当前下拉窗口
            if (e.KeyCode == Keys.Enter)
                // 直接关闭下拉窗口会触发PostChanges事件,引发赋值的代码
                this.SmDropDownForm.CloseDropDown(true);
        }
    }
}

控件中的使用方法

在窗体中放一个SmDropDownBox控件,然后设置其下拉窗体名称(DropDownFormName)属性为相应的自定义下拉窗体即可。

最终运行效果如下

我们可以在表格中使用

设置方法如下

最终执行效果如下图:

其实我们这个示例里面少了一些在SmDropDownBox里面写代码的步骤,这就让我们少了一些通过在SmDropDownBox输入进行筛选的功能。但是我们在下拉窗体中添加了简单筛选,如果想筛选可以在下拉窗口的简单筛选控件里面进行。然后我们可以通过控制SmDropDownBox不让直接输入数据,就可以实现既能筛选,又不让用户随意输入选项,保证输入的数据都是基础数据中有的值。