Previous topicNext topic
Help > 开发指南 > 窗体开发 > 控件参考 > 控件参考 > 组合类控件 >
SmSystemOption(Sm系统选项)

SmSystemOption(系统选项)控件是方便我们做类似系统选项这种配置信息时非常有用。我们可以在左边的选项上来回切换不同分组。

想精通使用SmSystemOption控件做出任意效果,比如说来个下拉窗口、下拉清单、弹出窗口等等功能的话,还是需要有一定的技术门坎的。所以我们平台为我们准备了一些常用功能,方便我们做一些配置信息时节省一些时间。

下面这些编辑器是帮助我们实现在属性表控件中能够实现特殊编辑的。我们可以先看看都准备了哪些功能,后面有需要的时候直接取用即可。

名称 说明
ApplicationFileCopyPickerEditor 以程序根目录作为根目录,弹出文件选择窗口,如果选择的路径是程序根目录下的,则直接返回相对于程序根目录的相对路径。如果不是程序根目录下的目录,则将相应的文件拷贝到程序根目录下,结果还是返回相对于程序根目录的相对路径。
ApplicationFilePickerEditor 以程序根目录作为根目录,弹出文件选择窗口,如果选择的路径是程序根目录下的,则直接返回相对于程序根目录的相对路径。如果不是程序根目录下的目录,则直接返回空字符串,认为选择的目录无效。
ApplicationImageCopyPickerEditor 以程序根目录下的Images文件夹作为根目录,弹出图片选择窗口,如果选择的路径是程序根目录Images文件夹下的,则直接返回相对于程序根目录Images文件夹的相对路径。如果不是程序根目录Images文件夹下的目录,则将相应的图片拷贝到程序根目录Images文件夹下,结果还是返回相对于程序根目录Images文件夹的相对路径。
ApplicationImagePickerEditor 以程序根目录下的Images文件夹作为根目录,弹出图片选择窗口,如果选择的路径是程序根目录Images文件夹下的,则直接返回相对于程序根目录Images文件夹的相对路径。如果不是程序根目录Images文件夹下的目录,则直接返回空字符串,认为选择的目录无效。
ApplicationPathSelectEditor 以程序根目录作为根目录,打开文件夹选择窗口,如果选择的路径是程序根目录下的,则直接返回相对于程序根目录的相对路径。如果不是程序根目录下的目录,则直接返回选择的目录路径。
ColorSelectEditor 颜色选择,弹出颜色选择窗口,设置并返回相应的颜色。
FilePickerEditor 文件选择,打开文件选择窗口,并返回选择的文件路径。并不执行其他动作。
FontSelectEditor 字体选择,打开字体选择窗口,设置并返回相应的字体。
GifPickerEditor 同ImagePickerEditor,只是针对Gif图片。
IcoPickerEditor 同ImagePickerEditor,只是针对Ico图片。
ImagePickerEditor 图片选择,打开图片选择窗口,并返回选择的图片路径。并不执行其他动作。
ImageSelectEditor 图片选择,打开图片选择窗口,并返回选择的图片路径。
NotesEditor 打开备注文本编辑窗口,方便我们编辑大段的文本信息。
PathSelectEditor 常规的目录选择,并将选择的目录返回。
ProjectFileCopyPickerEditor 以项目文件夹作为根目录,弹出文件选择窗口,如果选择的路径是项目文件夹下的,则直接返回相对于项目文件夹的相对路径。如果不是项目文件夹下的目录,则将相应的文件拷贝到项目文件夹下,结果还是返回相对于项目文件夹的相对路径。
ProjectFilePickerEditor 以项目文件夹作为根目录,弹出文件选择窗口,如果选择的路径是项目文件夹下的,则直接返回相对于项目文件夹的相对路径。如果不是项目文件夹下的目录,则直接返回空字符串,认为选择的目录无效。
ProjectGifCopyPickerEditor 和ProjectImageCopyPickerEditor类似,只是仅针对Gif图片。
ProjectIcoCopyPickerEditor 和ProjectImageCopyPickerEditor类似,只是仅针对Ico图片。
ProjectImageCopyPickerEditor 以项目文件夹下的Images文件夹作为根目录,弹出图片选择窗口,如果选择的路径是项目文件夹Images文件夹下的,则直接返回相对于项目文件夹Images文件夹的相对路径。如果不是项目文件夹Images文件夹下的目录,则将相应的图片拷贝到项目文件夹Images文件夹下,结果还是返回相对于项目文件夹Images文件夹的相对路径。
ProjectImagePickerEditor 以项目文件夹作为根目录,打开图片选择窗口,并返回选择的图片路径。并不执行其他动作。
ProjectPathSelectEditor 以项目文件夹作为根目录,打开文件夹选择窗口,如果选择的路径是项目根目录下的,则直接返回相对于项目根目录的相对路径。如果不是项目根目录下的目录,则直接返回选择的目录路径。
QQFormOpenEditor 打开指定的QQ好友聊天窗口。前提是自己的QQ已经登陆,并且此QQ号已经为自己的好友。
WebAddressOpenEditor 在默认浏览器中打开指定的网址。

下面我们就以一个简单的示例来介绍一下如何使用此控件。

前期准备:我们知道,想要做系统选项这类的配置信息,一般有两种保存方式,一种是以文件形式保存在本地,另外一种是以字段形式保存在数据库。我们的SmSystemOption为了方便,选择使用将配置信息保存在数据库,这样既可以实现同一个项目中多人使用同一套配置信息,也可以实现放到本地单机数据库(比如SQLite)实现本地用户个性化配置信息保存。所以我们第一步要做的就是根据要保存的配置信息创建表及相应的表结构。注意,创建的表得有一个自增长ID的主键,然后表记录为空或者保留一条记录,如果为空的话,我们会自动添加一条记录用来保存数据的。

第一步:创建表结构。为了演示,我们就按照下面的表结构创建表字段。为了测试我们又添加了一些日期、数值、逻辑类型的字段。

第二步:根据表结构创建类。SmSystemOption的本质是通过PropertyGrid操作类,所以我们得先弄一个这样的类。我们平台集成了一个代码生成器,可以帮我们来生成相应的类代码。如果为了让显示的属性名称是中文的话,可以在生成代码之前给字段添加一下中文标题。

然后根据下图指示,到数据管理模块中打开“生成数据库表对象”窗口,然后进行代码生成。

按照下图设置,先筛选并选择“OptionDemo”表,然后设置相应的参数。

生成语言:这个根据自己喜欢,用哪种语言都可以。

类类型:这里一定要选择“OptionObject”,这是我们专门为此场景设计的代码生成功能。

命名空间:这里设置一个自己定义好的命名空间,主要是为了与其他平台提供的类冲突。

第三步:修改编辑器。如果我们的系统配置只是一些常规的日期、逻辑字段、数值、字符串填写,这一步可以省略。我们这一步主要是要让用户在系统选项里面有下拉清单、弹出窗口、下拉窗口这种高级处理功能。上面点击“开始生成”按钮并正常生成代码后,我们就可以按照下图演示打开对应的代码。

因为这时候生成的代码还需要我们对相应的属性指定编辑器。这里先对属性的一些定义作一点简单的介绍。我们可以使用一些特性对属性的一些信息作一些定义,比较常用的有下面几种:

我们生成的代码是没有Editor编辑器的定义的,因为我们无法通过数据库的字段定义就推断出你想让用户如何编辑数据。所以这部分需要我们手动编辑。

我们编辑后的代码如下:

本章内容太多,代码直接放到另外一个页面了,想查看请移动“示例代码”。

代码修改这里有2个地方需要强调一下。一个是如果有一些字段不想显示在最终的属性控件中,可以考虑设置Browsable为False。另外一个,如果想修改下图中选项标签的名称,可以考虑修改代码中的“GetDisplayName”方法返回的值。

修改生成代码中下面这个方法中返回的字符串即可。

Vb.Net
        Public Overrides Function GetDisplayName() As String
           
Return "OptionDemo"
       
End Function

C#
 public override string GetDisplayName(){return "OptionDemo";}

代码修改完成后,记得保存退出。

第四步:添加命名空间。如果我们上面生成的命名空间之前没有使用过,这时就需要我们到代码编辑器中,去添加一个命名空间,方便后续的直接引用。

第五步:重启项目。上面的工作做完之后,我们需要重启一下项目。让命名空间引用和生成的类生效。

第六步:制作系统选项窗口。接下的工作是做一个窗口。我们先按照下图布局创建一个窗体。

然后再按照下面的代码在相应的事件中写好代码。

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
Imports sanMuSoft.UserClass

Namespace FormEvents
    Public Class Formcd85f3408a2244e2a6a98fd94bd750d1
        Inherits FormEventsBase
        Private SmSystemOption1 As SmSystemOption
        Public Sub SmSystemOptionHelp_Load(sender As Object,e As  System.EventArgs)
            SmSystemOption1=Me.SmForm.ControlDictionary()("SmSystemOption1")
            '定义一个OptionDemo对象,指定数据表名称和数据源
            Dim op As New OptionDemo("OptionDemo",Proj.SysDataFactory("UserDB"))
            SmSystemOption1.SystemOptions.Add(op)
            '为了演示多个选项,我们把平台中的系统选项也添加进来
            smSystemOption1.SystemOptions.Add(Proj.SystemOptionVars)
            smSystemOption1.SystemOptions.Add(Proj.SysSettingExtension)
        End Sub
        
        Public Sub btnConfirm_Click(sender As Object,e As  System.EventArgs)
            '保存我们所做的修改
            SmSystemOption1.Save()
            Me.SmForm.Close()
        End Sub
        
        Public Sub btnCancel_Click(sender As Object,e As  System.EventArgs)
            Me.SmForm.Close()
        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;
using sanMuSoft.UserClass;

namespace FormEvents
{
    public class Formcd85f3408a2244e2a6a98fd94bd750d1 : FormEventsBase
    {
        private SmSystemOption SmSystemOption1;
        public void SmSystemOptionHelp_Load(object sender, System.EventArgs e)
        {
            SmSystemOption1 = this.SmForm.ControlDictionary()["SmSystemOption1"] as SmSystemOption;
            // 定义一个OptionDemo对象,指定数据表名称和数据源
            OptionDemo op = new OptionDemo("OptionDemo", Proj.SysDataFactory["UserDB"]);
            SmSystemOption1.SystemOptions.Add(op);
            // 为了演示多个选项,我们把平台中的系统选项也添加进来
            smSystemOption1.SystemOptions.Add(Proj.SystemOptionVars);
            smSystemOption1.SystemOptions.Add(Proj.SysSettingExtension);
        }

        public void btnConfirm_Click(object sender, System.EventArgs e)
        {
            // 保存我们所做的修改
            SmSystemOption1.Save();
            this.SmForm.Close();
        }

        public void btnCancel_Click(object sender, System.EventArgs e)
        {
            this.SmForm.Close();
        }
    }
}

最后我们运行的效果如下: