我们有时候需要一些平台中数据规范没有给出下拉窗体效果。那么如何自定义一个下拉窗口,最后又如何在控件中、表格中使用此下拉窗口呢?下面我们就以一个完整的示例来展示一下。
第一步:创建一个下拉窗体,然后根据需要拖动相应的控件到设计窗体上。
第二步:修改表的名称为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不让直接输入数据,就可以实现既能筛选,又不让用户随意输入选项,保证输入的数据都是基础数据中有的值。