65.9K
CodeProject 正在变化。 阅读更多。
Home

适用于 VB.NET/C# 数据库应用程序的智能 ComboBox

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (7投票s)

2021 年 5 月 8 日

CPOL

10分钟阅读

viewsIcon

10866

downloadIcon

373

适用于 VB.NET/C# 平台和 MySQL/SQL Server 数据库应用程序的无代码 ComboBox

引言

ComboBox 是任何类型的计算机应用程序(无论是互联网还是桌面应用程序)中使用的主要图形用户界面 (GUI) 之一。由于它可以通过下拉功能显示数据,因此它是一个常用的 GUI,有时也称为下拉列表。无论如何,我不会讨论它的基本性质,因为每个人都很熟悉它,而是想关注它的适用性。ComboBox 控件允许搜索需要选择的项目。因此,该控件在应用程序中被使用了数百次,并且相应地编写了代码片段。即使代码已优化编写,但仍需在不同 ComboBox 的相应事件中编写一些代码。因此,在使用 .NET 平台开发桌面数据库应用程序时,ComboBox 控件 ShahCombo21 已使用一些自定义属性进行了自定义,其中包含动态功能。它被命名为 ShahCombo21。在“Visual Studio 2019”的 .NET 平台上,使用 XAMPP 版本 8.0.0 下的 MySQL 数据库和 Microsoft (MS) SQL Server Management Studio v18.8 对 ComboBox 控件进行了自定义和测试。所有这些工具都是免费版本。本文将简要介绍用于数据库处理和集成的自定义功能。建议访问 Youtube 视频演示(高级 ComboBox 第一部分 和 高级 ComboBox 第二部分),以了解 ComboBox 在 .NET 平台真实项目中的工作原理。

特点

通过结合使用十四 (14) 个高级自定义属性,ComboBox 的功能得到了增强/加强,如下面的设计时属性布局的Shah 高级/动态属性类别下的图所示。

这个高级 ComboBox 的关键特点是,只需要最少的代码/片段即可享受其完整的功能。实际上,实现数据选择和显示功能无需代码。只需要几行代码(取决于参数的数量)即可激活其数据操作功能,例如数据的保存更新删除,连接到数据库服务器(这是不可避免的,因为需要来自前端用户的数据输入)。该控件之所以被称为动态,是因为许多交互式自定义属性的值会根据设计时和运行时其他属性选择的值而改变。所有属性都带有 Shah 前缀,以便单独且方便地识别自定义属性。

首先,值得一提的是,该 DLL 文件可用于使用 VB.NET/C#.NET 开发数据库应用程序,以处理 MySQL/MS SQL Server 数据库中的数据。有两个 (2) 个与控件装饰相关的自定义属性,如上图所示,位于属性面板的底部。ShahComboBorderColorShahComboDropButtonColor 属性分别用于选择控件的“边框颜色”和“下拉按钮颜色”,如上图所示。其他十二 (12) 个属性已针对上述数据库的数据处理进行了自定义,详细信息将在以下段落中进行介绍。

数据相关的十二 (12) 个自定义属性按照其功能顺序排列在控件属性面板中,各功能将在以下步骤中简要描述。

  • 这一类中的第一个是名为 ShahDatabseSystemName 的列表类型属性,可以在其中选择数据库系统(MySQL 或 SQLServer)的名称。
  • 从名称 ShahConnectionString 可以看出,它在设计时就会处理/建立数据库与控件之间的连接。
  • 因此,基于此组的第一个和第二个属性的输入,数据库的名称将在应用程序开发的设计时ShahDatabaseName 属性下自动列出,正如声称的许多属性在设计时也是交互式/动态的。因此,当第一个和第二个属性改变时,ShahDatabaseName 的列表会自动改变。
  • ShahDataSourceOption 属性配备了从过程/表/视图/SQL 列表中选择数据库对象的选项。根据此属性的选择项,将从数据库服务器中筛选对象,并在 ShahDataSourceName 属性下列出。在设计时,它也是交互式和动态的。
  • 如果选择了 ShahDataSourceOption 的过程/表/视图选项,则会在 ShahDataSourceName 下生成一个列表。但如果选择 SQL,则需要在 ShahDataSourceName 的值中写入 SQL 语句,以在设计时和运行时激活它。
  • 如果 ShahDataSourceOption 为“过程”且 ShahDataSourceName 中选择的过程包含一些参数,则参数列表将作为集合自动在 ShahProcParameters 属性下找到,如下图所示。

  • 每个参数都包含三个 (3) 个集合属性,名为 ProcParamNameProcParamTypeProcParamValue。第一个和第二个属性的值将从连接的数据库自动生成,而第三个属性的值可以根据开发应用程序的需要,在设计时或运行时分配。
  • 将属于链接数据库的表的列号分配给 ShahColDisplay 属性的值,以便在开发的应用程序运行时显示数据,并将数据库表中相应主键的值列号分配给 ShahColKey 属性的值。运行时,此主键值将作为值返回给 ShahReturnValue 属性以供进一步使用。
  • 如果需要在运行时将选定的 ComboBox 列表数据中对应的选定数据显示给其他控件,则可以在设计时将“Textbox”、“label”、“Combobox”等对象控件与表列号保持连接。因此,ShahWantToDisplayDataOnControl 是一个布尔类型的属性,用于决定 ShahListOfControlsToDisplay 属性是否要激活/运行。如下图所示。

  • 最后一个交互式/动态集合类型属性是 ShahListOfControlsToDisplay,此集合的每个成员都具有名为 ControlNameControlTypeColumnNumber 的三个 (3) 个属性。
    • ControlName 是一个动态类型,它是一个控件名称列表,根据控件名称的顺序,将在设计时根据当前容器中的可用控件自动生成,如下图所示。

  • 在选择 ControlName 之后,ControlType 的值将自动分配,并且可以根据需要,在设计时或运行时分配 ColumnNumber 的值。
  • ColumnNumber 是连接数据库的表列号。
  • 最后一个与数据库相关的属性是 ShahReLoad,它在运行时进行数据操作(如INSERT/UPDATE/DELETE)的各种事件中非常有用,针对的是自定义 ComboBox 控件 ShahCombo21

最后,需要再次强调的是,阅读与音频/视频演示结合在一起,总能使任何事物更加清晰、有意义和全面。因此,最后再次重申,通过 Youtube 链接(高级 ComboBox 第一部分 和 高级 ComboBox 第二部分)中的真实项目视觉演示,可以体验所有这些功能,以获得更深入、更好的理解。

代码片段的技术方面

在前面的“特性”部分,我们讨论了 ComboBox 控件“ShahCombo21”的自定义属性。在这里,我们将讨论附带源代码的编程代码的技术方面。该控件是使用 Visual Basic.NET 编程语言自定义的。为了保持文章篇幅的简洁,代码不再在此文章中重复,因为它们已包含在附件中,建议在阅读本节时根据您的方便下载源代码。如果将所有 15 个文件作为 VB.NET 的 DLL 项目附加,那么就可以生成一个已编译的“ShahCombo21”自定义 ComboBox 控件的 DLL 文件,并将其包含在 VB.NET/C#.NET 开发项目中。代码片段和包含的文件将进行简要讨论,以便任何人都可以根据附件文件作为基础,轻松地更新/扩展该控件。

在附带的 15 个文件中,“ShahCombo21.vb”是主要/基础文件,其他相关信息是:程序集名称:ShahCombo21,根命名空间:ShahCombo21,目标框架:.NET Framework 4.7.2,应用程序类型:类库。所有基础属性都在“ShahCombo21.vb”文件中声明。其他文件的命名基于其可理解的功能。现在,根据控件“ShahCombo21”的自定义属性,将简要讨论代码片段。

用于两个装饰性属性“ShahComboBorderColor”和“ShahComboDropButtonColor”的代码片段可以在属性窗口下方找到,并包含在主/基础类的开头,在构造函数之前结束。WndProc 方法被实现以实现这些属性。

Enum 是枚举数据类型的一种表达式,Enum 中的数据是固定的。它是非常重要的编码工具,特别是用于创建对象的固定列表类型属性。因此,这里使用了两个 Enum,即“dataQryOption”和“enumDatabaseSystemName”。属性“ShahDatabseSystemName”和“ShahDataSourceOption”分别声明为“enumDatabaseSystemName”和“dataQryOption”,并相应地组织属性。

这个自定义控件由四个 (4) 个交互式/动态属性组成,其中两个 (2) 个是动态列表类型。“ShahDatabaseName”是列表类型属性,但由于此属性是动态的,因此无法使用 Enum。因此,需要使用‘MfuncDbObjectList.vb’模块,并与‘DropDownConverter’类和‘DropDownConverterDataAttribute’类一起使用。‘MfuncDbObjectList.vb’模块从数据库生成动态数组,而‘DropDownConverter’类与‘DropDownConverterDataAttribute’类一起将数组转换为列表,并设置为属性。这是创建动态列表类型属性的典型方法。同样值得注意的是,在主‘Public Class ShahCombo21’中的第 155 行和第 228 行,‘DropDownConverter’是如何实现的。“ShahDataSourceName”也是动态列表类型属性,并且也是使用‘MfuncDbList’模块以及‘DropDownConverter’类和‘DropDownConverterDataAttribute’类从数据库以相同方式生成的。

另外两个 (2) 个交互式/动态属性是“ShahProcParameters”和“ShahListOfControlsToDisplay”。它们是集合类型属性。设计集合类型属性需要一个集合基类和一个集合成员类。因此,在源代码文件中,可以发现‘clsShahProcParamCollection’类被用作集合基类,‘clsShahProcParam’类被用作“ShahProcParameters”属性实现的成员类。另一方面,‘clsShahListOfControlsToDisplayCollection’类和‘clsShahListOfControlsToDisplay’类分别用于“ShahListOfControlsToDisplay”。在这两种情况下,都采用了动态数组。用于“ShahProcParameters”属性的动态数组是通过 SQL 从数据库生成的,但引入了一个函数‘funcGetControlListToDisplay’来为属性“ShahListOfControlsToDisplay”生成数组。

最后,希望简短而有条理地说明代码片段能够帮助读者理解自定义属性的设计和实现机制。但是,请求有兴趣的读者联系我们以获取进一步的澄清。

Using the Code

在以下两种主要情况下,可能需要编写几行代码:

  1. 返回所选 ComboBox 数据对应的所有值,以及
  2. 保存/更新/删除操作

这两种情况都将包括示例代码进行描述,如下所示。

在第一种情况下,可以使用以下代码检索所选 ComboBox 数据的所有相应列数据,假设“cmbCity”是自定义控件的名称。

VB.NET

Dim xx As ShahCombo21.ccClsDbData = CType(cmbCity.SelectedItem, ShahCombo21.ccClsDbData)

        If xx IsNot Nothing Then

            MsgBox(xx.cKey.ToString())

            MsgBox("11th Column Data: " & Chr(9) & 
                    xx.cDataIntoArray(11).ToString & vbCrLf & "13th Column Data: " & 
                    Chr(9) & xx.cDataIntoArray(13).ToString)

        End If

C#

ShahCombo21.ccClsDbData xx = (ShahCombo21.ccClsDbData) cmbCity.SelectedItem;

            MessageBox.Show(xx.cKey);

            MessageBox.Show("Column 11 Data: " +"\t"+xx.cDataIntoArray[11].ToString() + 
                   "\r\n" + "Column 13 Data: " + "\t" + xx.cDataIntoArray[13].ToString());

在第二种情况下,如果该控件用于在运行时将数据从用户界面发送到连接的数据库进行数据操作(如保存/更新/删除),则需要使用下面的代码片段。

VB.NET

If MsgBox("Do you want to Save/Update/Delete???", vbYesNo, "Shah") = vbYes Then
            'ADD VALUE TO THE COLLECTION PARAMETERS ACCORDING TO THE FOLLOWING WAY-
            cmbCity.ShahProcParameters.Item(0).ProcParamValue = Val(cmbCity.ShahReturnValue)
            cmbCity.ShahProcParameters.Item(1).ProcParamValue = Trim(cityShort.Text)
            cmbCity.ShahProcParameters.Item(2).ProcParamValue = Trim(cityName.Text)
            cmbCity.ShahProcParameters.Item(3).ProcParamValue = 1
            cmbCity.ShahReLoad = True
            msgbox ("Saved")
            Else
            MsgBox("Thanks.")
End If

C#

if (MessageBox.Show("Do you want to Save/Update/Delete???", 
                    "ShahCombo21",MessageBoxButtons.YesNo)==DialogResult.Yes)
            {
                cmbCity.ShahProcParameters.get_Item(0).ProcParamValue = 
                                                       cmbCity.ShahReturnValue;
                cmbCity.ShahProcParameters.get_Item(1).ProcParamValue = Trim(cityShort.Text);
                cmbCity.ShahProcParameters.get_Item(2).ProcParamValue = Trim(cityName.Text);
                cmbCity.ShahProcParameters.get_Item(3).ProcParamValue = "1";
                cmbCity.ShahReLoad = true;
                MessageBox.Show ("saved");
            }
            else
            {
                MessageBox.Show("No Thanks");
            }

使用控件

自定义控件需要编译为 DLL 文件,并在“选择工具箱项”自定义控件选择框的“.NET Framework 组件”选项卡中选择 DLL 后,可以看到如下图所示。如果您有兴趣,请随时通过在下方留下评论与我们联系。我们将免费分发给用户。也可以使用本文附加的源代码文件创建 DLL 文件。

结论

自定义 ComboBox 控件 ShahCombo21 设计用于在其现有继承属性中集成一些动态功能,以增强其在广泛数据库应用程序中的能力。因此,此自定义控件可以在 VB.NET/C# 平台和 MySQL/SQL Server 数据库上使用,无需任何更改,只需最少的代码。它在数据库应用程序中的实现可以在一定程度上减少开发时间和管理工作。可以得出结论,这种控件自定义可以大大缩短应用程序开发周期。

历史

  • 2021 年 5 月 8 日:初始版本
© . All rights reserved.