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

扩展用户控件和 IDE/VS.NET 工具箱

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (11投票s)

2003年8月28日

4分钟阅读

viewsIcon

69468

downloadIcon

1070

扩展用户控件和 IDE 工具箱

引言

这是什么?

  • ctxtbx 继承自 TextBox (System.Windows.Forms)。控件扩展:如果文本框中的字符串长度 (ctxtbx.Text.Length) 超过指定字符数 (ctxt.FlashLength),则文本框开始闪烁,以指示用户输入的字符串无效(过长)。

  • 本项目旨在演示以下内容

    • 通过委托和事件扩展用户控件。

    • 将自定义控件添加到工具箱。通过属性浏览器访问控件属性。

    • 该控件打包在单个 DLL 中。任何 .NET/WIN32 客户端都可以使用它。

    • 应用程序说明 提供了将此模块部署到 C#/VB.NET 客户端所需的信息。请注意,RAD 工具仅适用于 C#/VB.NET。如果您打算在托管的 C++/COM/WIN32 客户端中使用此程序包,应用程序说明中提供的过程并不直接适用。

    • 本教程的前提条件:C#/VB.NET、Windows Forms、UEM(统一事件模型)。对以下主题有深入的理解将有所帮助,但并非完全必要:程序集、强名称、PPK、GAC。

应用程序说明

将模块安装到 GAC(全局程序集缓存)
  • 密钥文件:txtbxlib.snk(此步骤已完成。密钥文件位于您的解决方案文件夹中。)密钥文件通过 sn.exe 生成,并在 AssemblyInfo.cs 中引用。对于那些不完全熟悉此过程的人,请阅读以下主题:GACsn.exeassemblystrong name

    供您参考,以下是命令提示符条目

    sn -k txtbxlib.snk
    
  • Visual Studio.NET 命令提示符:gacutil -i txtbxlib.dll(您需要自己执行此操作。)(图 5)

  • 将控件添加到工具箱

    • 右键单击工具箱中的任意位置。(图 1)

      • 选择“自定义工具箱”(图 1, 2)

      • 选择“.NET Framework 组件”(图 2)

    • 浏览并选择 txtbxlib.dll(图 3)

    要在 Windows 窗体中使用该控件,只需将其从工具箱拖放到窗体上。(图 1)

三个控件属性

  • ctxtbx.FlashLength(触发闪烁的文本框中字符串的长度。默认值:10)

  • ctxtbx.flashColor(闪烁颜色。默认值:System.Drawing.Color.Red

  • ctxtbx.flashfreq(闪烁频率。默认值:1)

您可以通过属性浏览器(图 4)或在 ctxtbx 类构造函数中访问这些属性。现在,选择编辑框并注意浏览器和图 6(类层次结构)。请注意,只有属性可以在“属性浏览器”下找到 - 其他类属性此处未显示。

客户端实现就到这里了,只需将控件从工具箱拖放到 Windows 窗体上。程序包中包含一个示例应用程序用于演示(SomeClient)。在运行可执行文件之前,请确保

  • 控件程序集(txtbxlib.dll)已安装到 GAC

  • 工具箱引用 txtbxlib.dll
现在这是简单的方法,这意味着还有一种替代方法:只需从库源文件 txtbxlib.cs 中剪切并粘贴控件类 ctxtbx,然后在 Windows 窗体的构造函数中实例化 ctxtbx。请务必包含以下命名空间:System.ThreadingSystem.DrawingSystem.WindowsSystem.Windows.FormsSystem

    架构和实现

    ctxtbx 中的所有内容都打包在一个 DLL(托管 C# 类库)中:txtbxlib.dll

    请注意,已将对 System.DrawingSystem.Windows.Forms 的引用添加到解决方案中。

    程序包的顶部是 txtbxlib 命名空间。ctxtbx 类是 DLL 中实现的唯一一个类。

    也许解释代码的最简单方法是跟踪用户单击文本框时发生的事件序列。所以,这是

    • 用户输入文本框。

    • OnKeyDown 事件被触发。
      protected override void OnKeyDown(KeyEventArgs e)
      {
          CheckLength();
          base.OnKeyDown(e);
      }
      

      该方法将调用 CheckLength

    • CheckLength 被触发。该方法在用户每次向文本框输入文本时检查 ctxtbx 中的字符串长度。如果字符串长度 ctxtbx.Length 超过 ctxtbx.FlashLength,则触发 OutOfRangeEvent。否则,什么也不发生。
      public delegate int OutOfRangeDelegate(int num);
      
      publicevent OutOfRangeDelegate OutOfRangeEvent;
      
      现在,OutOfRangeEvent 及其处理程序之间的关联可以在构造函数中找到
      OutOfRangeDelegate d1 = new OutOfRangeDelegate(this.OnOutOfRange_1);
      OutOfRangeDelegate d2 = new OutOfRangeDelegate(this.OnOutOfRange_2);
      
      this.OutOfRangeEvent += d1;
      this.OutOfRangeEvent += d2;
      

      上面的代码片段通过委托 OutOfRangeDelegate 将处理程序 OnOutOfRange_1OnOutOfRange_2 映射到 OutofRangeEvent

    • 事件处理程序被调用。

      • OnOutOfRange_1<CODE>

        此方法启动一个线程来执行 FlashIt(..) - 这会产生闪烁效果。

      • OnOutOfRange_2

        此方法将边框样式从 fixed-single 更改为 fixed-3D

    • 假设用户意识到她犯了一个错误并截断了字符串长度小于 ctxtbx.FlashLength。再次,OnKeyDown 被触发。

    • CheckLength 依次被触发。但是,这次,由于文本框中的字符数 ctxtbx.Length 小于 ctxtbx.FlashLength,因此 OutOfRangeEvent 不会被触发,并且执行闪烁的线程(m_FlashThread)将被中止。

    基本上就是这样。

    • 项目包:ctxtbx.zip

    • ctxtbx 控件

      • 项目类型:C# 类库

      • 项目名称:txtbxlib

      • 二进制文件:txtbxlib.dll(Release 文件夹)

      • 密钥文件:txtbxlib.snk

    • SomeClient

      • 项目类型:C# Windows 应用程序

      • 二进制文件:SomeClient.exe(您需要先将控件程序集安装到 GAC!)
    © . All rights reserved.