2019独角兽企业重金招聘Python工程师标准>>>

一、效果示意

今天设计了一个自定义控件,用于满足下面的场景:

有一句话,有多个子句组成,每一个子句都要设置对应的超链接。举个例子,比如现有要素:姓名、国籍、生年、卒年。可以组成这么一句话:

“【理查德·尼克松】,国籍【美国】,生于【1913年1月9日】,卒于【1994年4月22日】。”

但是,这四个要素并不是每条数据都有的,除了姓名是必须的,后面三点要素都是可选的。比如只有姓名、生年、卒年,没有国籍时,拼成的话就是:

“【霍去病】,生于【前140年】,卒于【前117年】。”

超链接点击后,根据点击的文字,可以触发对应的事件。

二、控件设计

建立一个继承UserControl类的自定义控件,名为MyLinkLabelPanel,里面有五个Panel,最中间的Panel中添加一个Dock为Fill的LinkLabel。

控件代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace LinkLabelTest
{/// <summary>/// 自制超链接控件/// </summary>public partial class MyLinkLabelPanel : UserControl{public MyLinkLabelPanel(){InitializeComponent();}/// <summary>/// 链接详细信息/// </summary>private class SituationDetail{/// <summary>/// 链接起始点/// </summary>public int Start;/// <summary>/// 链接长度/// </summary>public int Length;/// <summary>/// 链接数据/// </summary>public string Data;/// <summary>/// 子句内容/// </summary>public string Description;/// <summary>/// 链接详细信息/// </summary>/// <param name="data">链接数据</param>/// <param name="description">子句内容</param>public SituationDetail(string data, string description){this.Data = data;this.Description = description;}/// <summary>/// 重载:ToString函数,返回子句内容Description/// </summary>/// <returns></returns>public override string ToString(){return Description;}};/// <summary>/// 根据控件属性设置,生成链接文本/// </summary>public void RefreshData(){lnkContent.Text = "";lnkContent.Links.Clear();LinkedList<SituationDetail> linkedList = new LinkedList<SituationDetail>();if (!string.IsNullOrWhiteSpace(Name)){linkedList.AddLast(new SituationDetail(Name, "【" + Name + "】"));}else{lnkContent.Text = "人物姓名不能为空";return;}if (!string.IsNullOrWhiteSpace(Nationality)){linkedList.AddLast(new SituationDetail(Nationality, "国籍【" + Nationality + "】"));}if (!string.IsNullOrWhiteSpace(BornDate)){linkedList.AddLast(new SituationDetail(BornDate, "生于【" + BornDate + "】"));}if (!string.IsNullOrWhiteSpace(DeadDate)){linkedList.AddLast(new SituationDetail(DeadDate, "卒于【" + DeadDate + "】"));}if (linkedList.Count != 0){string result = String.Join(",", linkedList) + "。";lnkContent.Text = result;LinkedListNode<SituationDetail> node = linkedList.First;for (int i = 0; i < result.Length; i++){if (result[i] == '【'){node.Value.Start = i;}else if (result[i] == '】'){node.Value.Length = i - node.Value.Start + 1;lnkContent.Links.Add(node.Value.Start, node.Value.Length, node.Value.Data);if (node.Next == null){break;}else{node = node.Next;}}}}else{lnkContent.Text = "数据缺失";}}#region 对外开放的可设置属性/// <summary>/// 姓名/// </summary>private string _name;///<summary>/// 姓名///</summary>[System.ComponentModel.Description("姓名")]public string Name{get{return _name;}set{_name = value;}}/// <summary>/// 国籍/// </summary>private string _nationality;///<summary>/// 国籍///</summary>[System.ComponentModel.Description("国籍")]public string Nationality{get{return _nationality;}set{_nationality = value;}}/// <summary>/// 出生日期/// </summary>private string _bornDate;///<summary>/// 出生日期///</summary>[System.ComponentModel.Description("出生日期")]public string BornDate{get{return _bornDate;}set{_bornDate = value;}}/// <summary>/// 逝世日期/// </summary>private string _deadDate;///<summary>/// 逝世日期///</summary>[System.ComponentModel.Description("逝世日期")]public string DeadDate{get{return _deadDate;}set{_deadDate = value;}}#endregion/// <summary>/// 单击链接时触发/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void lnkContent_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e){lnkContent.Links[lnkContent.Links.IndexOf(e.Link)].Visited = true;string selectedItem = e.Link.LinkData.ToString();MessageBox.Show("当前点击条目为:" + selectedItem.ToString());}}
}

注:根据要生成的语句内容,可以灵活将一句话拆分成多个子句。每个子句可以单独写一个属性存放其中的值,将每个子句都存放在类SituationDetail中,在函数RefreshData中将这些子句要素拼成完整的一句话。

三、控件使用

建立一个C#窗体应用程序,主窗体命名为FormMain,放置如下控件:

窗体代码如下,这段代码给出了自定义控件MyLinkLabelPanel的使用示例:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace LinkLabelTest
{public partial class FormMain : Form{public FormMain(){InitializeComponent();}private void FormMain_Load(object sender, EventArgs e){btnRefreshData_Click(null, null);}private void btnRefreshData_Click(object sender, EventArgs e){//测试数据pnlMain.Name = txtName.Text;pnlMain.Nationality = txtNationality.Text;pnlMain.BornDate = txtBornDate.Text;pnlMain.DeadDate = txtDeadDate.Text;pnlMain.RefreshData();}}
}

END

转载于:https://my.oschina.net/Tsybius2014/blog/549291

C# - 基于LinkLabel可动态生成多超链接信息的自定义控件相关推荐

  1. java基于word模板动态生成word及转pdf实践

    在项目中很容易会遇到需要动态生成pdf的应用场景,其实现方式也比较多 由于项目的关系,对于这种组件性的开发方式我想的是怎么方便怎么来,怎么快就怎么来 在咨询了之前做政务系统的同学后,他们都一致推荐我使 ...

  2. Python 后台基于 PackerNg 格式动态生成 APK 渠道包

    2019独角兽企业重金招聘Python工程师标准>>> 本文代码的原理基于 git@github.com:mcxiaoke/packer-ng-plugin.git 项目. 该项目用 ...

  3. html动态生成榜单信息,排行榜.html

     排行榜 $axure.utils.getTransparentGifPath = function() { return 'resources/images/transparent.gif'; } ...

  4. 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML

    基于webpack的前端工程化开发解决方案探索(一):动态生成HTML 参考文章: (1)基于webpack的前端工程化开发解决方案探索(一):动态生成HTML (2)https://www.cnbl ...

  5. 基于Element组件下动态生成多级表头以及数据

    介绍 element是一套基于vue的组件,本文主要介绍如何根据后端传输数据来动态生成表格. 代码 html 利用vue里的for循环来动态生成表头,再利用if语句判断是否有二级表头,并将对应key赋 ...

  6. asp mysql 可编辑树状,基于数据库动态生成树形目录-ASP教程,数据库相关

    一. 目录树的广泛应用 为了这段内容,在百度上搜了搜,内容一大通,相关的竟没有.搜什么搜嘛?用处不是明摆着吗?资源管理器文件夹的管理,论坛中多级论坛的管理,java中的awt正是缺乏包括树形目录这样的 ...

  7. 基于vue+element实现多级菜单动态生成

    使用element的NavMenu组件+vue的组件递归实现动态生成菜单. 首先创建对象记录菜单的标题.链接.子集等信息. menus: [{title: "首页",icon: & ...

  8. python动态映射_Python Django框架url反向解析实现动态生成对应的url链接示例

    本文实例讲述了Python Django框架url反向解析实现动态生成对应的url链接.分享给大家供大家参考,具体如下: url反向解析:根据url路由规则,动态生成对应的url链接 (防止硬编码). ...

  9. awstats CGI模式下动态生成页面缓慢的改进

    本文可以看做是 多server多站点情况下awstats日志分析 这篇文章的下篇,在使用过程中发现awstats在cgi模式下动态生成分析报告慢的问题 (尤其是有些站点每天两个多G的日志,查看起来简直 ...

最新文章

  1. AI大厂迎最冷冬天?网传阿里拟裁员2万人,净利下滑高管离职
  2. 【从零学习OpenCV 4】Image Watch插件的使用
  3. oracle9i的全局变量,Oracle9i, 10g 如何抓取绑定变量的值
  4. linux gcc 链接静态库的几种方式
  5. Unity OBB分包(基础APK+OBB) 与apk签名
  6. OpenCV参考手册之Mat类详解1
  7. Python中内存管理的问题
  8. IntelliJ IDEA这样配置,代码效率嗖嗖的
  9. cass参考手册_CASS9.2参考手册
  10. 网页html5游戏修改器,正版H5游戏无限物品
  11. ansys linux运行_ANSYS|大型Linux计算机ANSYS运算要点
  12. 开源BI工具 - Superset
  13. SAP 系统银行账户管理
  14. Hadoop Cascading简介
  15. 手把手教你安装vivado2015.4开发环境
  16. 免费PPT模板网站,模板精品好用,直接下载
  17. Python画糖葫芦和奥运五环
  18. CSS鼠标滑过div上移效果
  19. [NOIP2011]聪明的质监员
  20. AD(活动目录)详解

热门文章

  1. 微服务架构实战项目Serverless的持续交付与架构案例
  2. 35.angularJS的ng-repeat指令
  3. 更清晰的认识对象——深拷贝与浅拷贝
  4. HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程
  5. 前端人员如何模拟慢网速环境
  6. 更换XP SN的vbs
  7. 阿里开源分布式事务解决方案 Fescar 全解析
  8. 对LinqtoExcel的扩展 【数据有限性,逻辑有效性】
  9. 备份TB级别Oracle数据库的一些技巧
  10. No 'Access-Control-Allow-Origin' header is present on the requested resource.