组合多个控件的控件子类

2024-03-05

我正在尝试扩展 TextBox 以在其左侧添加一个标签并将其视为一个控件,这样我就不必跟踪它们的大小、位置等。

我创建了一个扩展 Control 并具有 TextBox 和 Label 字段的 TextBoxWithLabel 类,但我不太确定要对 onPaint() 做什么 - 我是否必须告诉它手动绘制这两个项目?如果是这样,怎么办?我猜默认的继承行为不会达到“检查我是否包含任何子控件,如果包含,则绘制它们”......

这是最好的方法吗?我之前让我的类扩展了 TextBox 并只添加了 Label 字段,但当然它没有添加到包含 TextBoxWithLabel 的面板中,因此没有绘制。

任何建议或正确的方向表示赞赏。

Thanks,

Alex


这里的典型方法是在 UserControl 中放置标签和文本框。但这很痛苦,您必须将文本框的许多属性和事件添加到用户控件,以便它至少类似于文本框。丑陋的样板代码。

另一种方法是创建一个自定义文本框,将其隐藏在父级的标签控件中。这完全像一个文本框,无需做任何工作。将新类添加到您的项目中并粘贴下面所示的代码。编译。将新控件从工具箱顶部拖放到窗体上。将“描述”属性设置为您希望在标签中看到的文本。

using System;
using System.Drawing;
using System.Windows.Forms;

class MyTextBox : TextBox {
    private Label label;
    public MyTextBox() {
        label = new Label();
        label.AutoSize = true;
        label.Font = this.Font;
        label.Location = this.Location;
        label.Resize += new EventHandler(label_Resize);
    }
    protected override void OnParentChanged(EventArgs e) {
        // Keeps label on the same parent as the text box
        base.OnParentChanged(e);
        label.Parent = this.Parent;   // NOTE: no dispose necessary
    }

    private void moveLabel() {
        // Keep label right-aligned to the left of the text box
        label.Location = new Point(this.Left - label.Width - 10, this.Top);
    }
    private void label_Resize(object sender, EventArgs e) {
        moveLabel();
    }
    protected override void OnLocationChanged(EventArgs e) {
        base.OnLocationChanged(e);
        moveLabel();
    }

    public string Description {
        get { return label.Text; }
        set { label.Text = value; }
    }

    public override Font Font {
        get { return base.Font; }
        set { base.Font = label.Font = value; }
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

组合多个控件的控件子类 的相关文章

随机推荐

  • 如何立即查看IntelliJ Idea项目树中的编译错误?

    我想知道是否可以配置 IntelliJ Idea 以立即显示项目树中的类文件的编译错误 目前 如果无法编译类 我需要手动触发重新编译以查看类上的错误标记 从 IntelliJ 12 开始 有一个选项可以根据源代码更改自动构建项目 在 设置
  • 在powershell中将字符串转换为日期时间

    我正在尝试使用以下行解析文件名 字符串 并将它们转换为 powershell 中的日期 datetime ParseExact DirName BaseName yyyyMMdd null 问题是 并非该目录中的所有文件夹都遵循该命名约定
  • Pytesseract 对于实时 OCR 来说非常慢,有什么方法可以优化我的代码吗?

    我正在尝试使用 python 创建实时 OCRmss and pytesseract 到目前为止 我已经能够捕获整个屏幕 其 FPS 稳定为 30 如果我想捕获大约 500x500 的较小区域 我已经能够获得 100 FPS 然而 一旦我包
  • Laravel 5 路由前缀

    我想要一条以国家 地区为前缀的路线 像这样 us shop ca shop fr shop 我的想法是这样做
  • 排列未排序

    我知道一种算法 可以在网上找到 对排列进行排名 即给定一个排列 将整数索引返回到按字典顺序排序的排列列表中 但我不知道unrank执行相反操作的算法 给定索引 i 返回按字典顺序排列的第 i 个排列 由于我找不到任何内容 有人可以透露一些信
  • IIS Web.Config 301 重定向查询字符串参数 (?)

  • javafx-TableView 作为组合框弹出窗口(尝试并能够部分实现。需要进一步帮助)

    我需要的 需要一个可编辑的组合框 它可以在键入时过滤弹出窗口上的数据 并且第一个匹配的项目应突出显示 并应在按 Enter 键时设置为组合中的文本 弹出窗口应该是一个包含 2 或 3 列的表格视图 附有屏幕截图 在图像中 它是一个文本字段
  • 使 高度适合页面

    考虑一个包含三行且高度分别为 10 10 的表格 我希望中间的单元格足够高以垂直适应页面 不幸的是 height 100 在 table tr 或 td 级别不起作用 可能是由于标准的原因 即使它恰好有效 我也不想要 100 我想要 100
  • Google Protocol Buffers:根据我的请求设置日期值时,c.toArray 不是函数

    我正在尝试构建一个创建请求grpc web 我已经生成了协议缓冲区 并且可以成功获取信息 但在创建请求时遇到问题 Eg const request new PricingMethodRequest request setCurrencyId
  • 我的 Windows 窗体应用程序大小在不同笔记本上发生变化

    我的项目编码进展顺利 但今天我注意到一个问题 我的主笔记本电脑具有全高清 1920x1080 分辨率 我正在此处编写我的项目 当我将主笔记本电脑的分辨率更改为 1280x1024 1280x800 或 1024x768 时 没有问题 我的应
  • git - 服务器主机密钥未缓存

    我尝试将更改从本地存储库推送到远程存储库 当我输入 git push origin 我收到以下错误 The server s host key is not cached in the registry You have no guaran
  • Django - 没有名为 app 的模块

    我一直在尝试让 django 编写的应用程序正常工作 但它根本不工作 我也已经工作了一段时间 它在开发服务器上完美运行 但我无法放入生产环境 apahce 我的项目名称是 apstat 应用程序名称是 basic 我尝试按以下方式访问它 块
  • Python 多处理:同步类文件对象

    我正在尝试创建一个类似对象的文件 该对象在测试期间分配给 sys stdout sys stderr 以提供确定性输出 它并不意味着快速 只是可靠 到目前为止我所拥有的almost有效 但我需要一些帮助来消除最后几个边缘情况错误 这是我当前
  • HQL 意外的 AST 节点::

    我的代码无法注入以下存储库 根据堆栈跟踪 我的 HQL 语法似乎无效 但我不确定我做错了什么 Repository public interface JobSetRepository extends JpaRepository
  • 命令“npm install fs”出现问题

    我不习惯使用 Linux 所以也许这是一个愚蠢的问题 在我正在进行的实验室中 系统要求我运行命令 npm install fs 来读取 写入文件 但这是我遇到的错误 我不知道如何解决它 我也找不到类似的问题 PS 我正在 Ubuntu 17
  • 帮助在 Node.js 中需要 npm 模块

    我觉得我在这里缺少一些非常基本的东西 所以我安装了一个 npm 库npm install somelib 根据我读过的内容 我应该能够简单地做一个 var somelib require somelib 但它找不到任何东西 我确实有一个no
  • Chrome 中的 ScriptManager.RegisterHiddenField

    我正在处理一些利用 ScriptManager RegisterHiddenField 来跟踪数据模型修改的代码 它在 IE 和 FF 中运行良好 但在 Chrome 中遇到问题 如果您添加以下内容 就会出现该问题的一个简单示例 prote
  • 如何获取 ClickOnce 应用程序的文件夹路径

    我需要在控制台 ClickOnce 所在的同一文件夹中写入一个文件 application 可执行文件 驻留 它从中启动的文件夹 我尝试使用Application StartupPath Path GetDirectoryName Asse
  • 在C中缩小文件

    如何用 C 语言缩小文件 例如 如果我打开一个 2mb 的文件 做了一些工作并决定只有 1mb 的文件仍然存在 这是如何完成的 我知道如何使用 write fd 写入文件 但是如果我想在文件中间切出某些部分或截断它怎么办 您可能正在寻找tr
  • 组合多个控件的控件子类

    我正在尝试扩展 TextBox 以在其左侧添加一个标签并将其视为一个控件 这样我就不必跟踪它们的大小 位置等 我创建了一个扩展 Control 并具有 TextBox 和 Label 字段的 TextBoxWithLabel 类 但我不太确