c#模拟看板控件_在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件...

在很多时候,我们做一些非常规化的界面的时候,往往需要创建一些用户控件,在其中绘制好一些基础的界面块,作为后续重复使用的一个单元,用户控件同时也可以封装处理一些简单的逻辑。在开发Winform各种类型项目,我都时不时需要定制一些特殊的用户控件,以方便在界面模块中反复使用。我们一般是在自定义的用户控件里面,添加各种各样的界面控件元素,或者封装一些特殊的函数处理共外部调用等。本篇随笔主要介绍基于DevExpress的Winform开发经验,介绍一个类似看板信息的用户控件,并在TabelLayout和StackLayout布局控件中进行展示。

1、用户控件界面的处理

在偶尔的一个场合下,看到一个牙医管家的软件界面做的非常不错,其中有一个预约列表的界面感觉非常好,如下界面所示。

b76fb7bc11a3

其中它的每个用户信息列表里面,都是一个综合信息的展示,非常直观,估计应该是用户自定义控件做的。

在其中里面,有不同的字体,各式图标,以及内容的信息展示, 这个我在DevExpress的列表控件里面,没有看到可以如此定义列表内容的,在DevExpress的GridView里面有一个看板模板的定义有点接近,但是试了一下,可调性不好,于是放弃寻求其他接近方案,玩遍DevExpress的控件后,发现最好的方式应该是自定义用户控件的方式来解决这个界面问题。

花了一点时间,制作了一个用户控件,在其中添加一个LayoutControl方便控制布局,添加一些标签以及设置了一些图标,得到下图所示。

b76fb7bc11a3

image

左侧的颜色条由于使用Group控件,因此宽度暂时无法调整,如果介意大小,我们可以在其中在创建一个LayoutControl,然后在其中方式内容即可。

我们改变布局,然后添加一个颜色块,得到类似界面如下所示。

b76fb7bc11a3

image

我们来定义一下用户控件的源码部分,修改其中源码,增加对应的属性,方便动态设置用户控件的相关属性,如颜色块,项目背景色,以及绑定的对象信息等内容。

b76fb7bc11a3

image

然后在界面加载完毕后,设置对应的信息和颜色信息,如下代码所示。

///

/// 窗口加载事件

///

///

///

private void UserItemControl_Load(object sender, EventArgs e)

{

BindData();

RefreshColor();

}

///

/// 根据用户定义信息,显示不同的内容

///

private void BindData()

{

if(this.UserItemInfo != null)

{

var info = this.UserItemInfo;

this.lblCustomerName.Text = info.CustomerName;

this.lblMobile.Text = info.Mobile;

this.lblReceiver.Text = info.Receiver;

this.lblRecordDate.Text = info.RecordDate;

this.lblRecordNo.Text = info.RecordNo;

this.lblDealType.Text = "";

this.lblStar.ImageOptions.ImageIndex = GetStarImageIndex(info.Stars);

if (!info.IsVip)

{

this.lblVip.Visibility = LayoutVisibility.Never;

}

}

}

///

/// 刷新背景色

///

private void RefreshColor()

{

if (ItemBlockColor != Color.Empty)

{

this.itemColor.AppearanceItemCaption.BackColor = ItemBlockColor;

}

if (ItemBackColor != Color.Empty)

{

layoutControl1.BackColor = ItemBackColor;

}

}

但我们鼠标浮动在项目上或者离开的时候,或者单击某项的时候,我们变换下颜色,方便区分显示。

private void layoutControl1_MouseLeave(object sender, EventArgs e)

{

if (!this.IsSelected)

{

this.layoutControl1.ResetBackColor();

}

}

private void layoutControl1_MouseEnter(object sender, EventArgs e)

{

if (!this.IsSelected)

this.layoutControl1.BackColor = Color.FromArgb(192, 255, 192);

}

private void layoutControl1_Click(object sender, EventArgs e)

{

this.IsSelected = true;

OnItemClick?.Invoke(this, e);

}

完成这些后,我们需要在窗体上对内容进行初始化。

最后我们看看界面的效果如下所示

b76fb7bc11a3

image

或者下面这样的界面布局。

b76fb7bc11a3

image

如果嫌弃边框红色不好看,我们 可以修改边框为灰色调一点的,这样总体看起来效果如下所示。

b76fb7bc11a3

image

得到和我们最终需要的界面很接近了。

一般除了悬浮鼠标颜色变化外,控件单击后,我们会设置不同的背景色,以示区分。

///

/// 是否选中节点

///

public bool IsSelected

{

get

{

return m_IsSelected;

}

set

{

m_IsSelected = value;

this.ItemBackColor = value ? Color.FromArgb(255, 255, 192) : Color.Transparent;

this.RefreshColor();

}

}

一般列表界面中,我们除了支持鼠标移动、单击变色的效果外,我们还希望支持通过键盘箭头上下键进行上下浏览项目。我们如果需要使用键盘的按键,需要设置窗体的KeyPreview属性为True,

然后跟踪按键的事件即可,如下所示。

this.KeyPreview = true;

this.KeyUp += FrmKanBan_KeyUp;

按键事件捕捉处理如下所示,主要就是判断选中的用户控件,并对面板的子控件的选中效果进行处理。

private void FrmKanBan_KeyUp(object sender, KeyEventArgs e)

{

//单击鼠标或者切换按键,会触发用户控件获得selectItem对象,可以进行箭头上下移动

if (selectItem != null)

{

var panel = selectItem.Parent;

if (panel != null)

{

//获取操作项的索引值

int oldIndex = panel.Controls.IndexOf(selectItem);

if (e.KeyCode == Keys.Up)

{

if (oldIndex > 0)

{

//通过序号获得新的控件,并单击它触发选择事件

var newCtrl = panel.Controls[oldIndex - 1];

Item_OnItemClick(newCtrl, new EventArgs());

}

}

else if (e.KeyCode == Keys.Down)

{

if (oldIndex < (panel.Controls.Count - 1))

{

//通过序号获得新的控件,并单击它触发选择事件

var newCtrl = panel.Controls[oldIndex + 1];

Item_OnItemClick(newCtrl, new EventArgs());

}

}

}

}

}

界面中用户控件的切换选中效果,需要先清空之前所有的选择,然后在设置新的选中控件,所以还需要对控件触发单击事件进行处理,如下所示。

///

/// 选中的用户控件对象实例

///

UserItemControl selectItem = null;

///

/// 单击用户控件,触发清除所有标记后,再次设置选中的项目标记

///

private void Item_OnItemClick(object sender, EventArgs e)

{

//清空所有控件的选中标记

var panel = (PanelControl)((Control)sender).Parent;

foreach (Control ctrl in panel.Controls)

{

var item = ctrl as UserItemControl;

if(item != null)

{

item.IsSelected = false;

}

}

//设置选中控件

selectItem = ((UserItemControl)sender);

selectItem.IsSelected = true;

this.Text = selectItem.UserItemInfo.CustomerName + "-选中";

//如果在面板中遮挡,移动滚动条,可以查看到完整用户控件界面

panel.ScrollControlIntoView(selectItem);

}

如下效果所示。

b76fb7bc11a3

image

2、TabelLayout和StackLayout布局控件的介绍和使用

我们在做Winform开发的时候,一般知道,微软传统Winform的布局提供两个控件,FlowLayoutPanel和TableLayoutPanel,一个是流式布局,一个是表格布局,各有各的用处。流式布局主要就是按照顺序挨个放置控件,表格布局主要按照表格的定义的行列单元格,严格放置控件,表格单元格控制强度更大,而且控件具有拉伸效果。

对于DevExpress,我们一般还是倾向于采用它提供给的控件来做界面,可以很好融合它的皮肤效果,相对于Winform传统两个布局控件,DevExpress提供了两个封装效果相当的控件布局StackPanel和 TablePanel,他们的效果实现大同效果,不过调用的接口不同。

b76fb7bc11a3

image

对于两个控件,我们希望里面的内容自动出现滚动条,那么设置属性AutoScroll 为True即可,如下代码所示。

panel.AutoScroll = true;

而StackPanel另外需要LayoutDirection,也就是控件顺序展现的方式,如下代码所示。

panel.LayoutDirection = StackPanelLayoutDirection.TopDown;

使用StackPanel面板来测试展示用户控件列表的界面代码如下所示。

///

/// 使用StackPanel对用户控件布局进行处理

///

private void InitPanel(StackPanel panel)

{

panel.AutoScroll = true;//面板自动出现滚动条

panel.LayoutDirection = StackPanelLayoutDirection.TopDown;//从上往下展示

panel.Controls.Clear();//清空界面

var list = GetInfoList(); //获取用户控件绑定的对象信息列表

for (int i = 0; i < list.Count; i++)

{

//定义用户控件实例

var item = new UserItemControl();

item.UserItemInfo = list[i];//绑定对象信息

item.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;

item.ItemBlockColor = colors[i %10]; //变化颜色

item.OnItemClick += Item_OnItemClick;//触发选中事件

panel.Controls.Add(item);

}

}

对于表格布局TablePanel控件来说,使用初始化控件的方式也差不多,不过有个别地方注意即可。

///

/// 使用TablePanel对用户控件布局进行处理

///

private void InitPanel(TablePanel panel)

{

panel.AutoScroll = true;//面板自动出现滚动条

panel.Controls.Clear();//清空界面

panel.Rows.Clear();//清空行

panel.Columns.Clear();//清空列

//添加列定义(增加一个列即可)

panel.Columns.Add(new TablePanelColumn(TablePanelEntityStyle.Relative, 55F));

var list = GetInfoList(); //获取用户控件绑定的对象信息列表

for (int i = 0; i < list.Count; i++)

{

//定义行信息

panel.Rows.Add(new TablePanelRow(TablePanelEntityStyle.AutoSize, 100F));

//定义用户控件实例

var item = new UserItemControl();

item.UserItemInfo = list[i];

//定义拉伸效果

item.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;

item.ItemBlockColor = colors[i % 10]; //变化颜色

item.OnItemClick += Item_OnItemClick;//触发选中事件

//先添加控件到面板集合中

panel.Controls.Add(item);

//设置控件的单元格位置

panel.SetCell(item, i, 0);

}

//添加多一行,确保布局

panel.Rows.Add(new TablePanelRow(TablePanelEntityStyle.AutoSize, 100F));

}

添加控件的时候,需要注意下面的代码,才能正常展示控件信息,否则无法看到用户控件。

//先添加控件到面板集合中

panel.Controls.Add(item);

//设置控件的单元格位置

panel.SetCell(item, i, 0);

最后对比下效果,左边是TablePanel,右边是StackPanel展现出来的效果。

b76fb7bc11a3

image

以上就是界面如何在DevExpress开发中使用各种用户控件进行用户控件的创建、以及实现鼠标进入、移出、单击的不同效果,以及实现键盘上下箭头按键的事件选中效果,并介绍DevExpress中两个布局控件TabelPanel和StackPanel的正常使用,达到展示控件信息的作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java jdbc 详解_JDBC概述及详解各个对象

JDBC(Java DataBase Connectivity)详解一.概念&#xff1a;JDBC是一种可执行SQL语句的JavaAPI&#xff0c;Java数据库链接&#xff0c;Java语言操做数据库mysql二.本质&#xff1a;JDBC是一种可用于执行SQL语句的Java API&#xff0c;由一些Java语言编写的类和页面组成。各个数…

java空心字木塔_我国七个千年古塔:第四个空心没有塔顶,最后一个是木塔无钉无铆...

1、崇圣寺三塔&#xff0c;云南大理&#xff0c;公元824—839年崇圣寺三塔是一个三塔三阁组成的建筑群&#xff0c;最大的主塔又名千寻塔。是中国现存层数最多的古佛塔&#xff0c;拥有16层。崇圣寺三塔历经30多次地震不倒&#xff0c;极其顽强。2、大雁塔&#xff0c;陕西西安…

java8 ie_Java8语法糖之Lambda表达式_Hudie.的博客-CSDN博客

原文作者&#xff1a;编程一只蝶原文标题&#xff1a;Java8语法糖之Lambda表达式发布时间&#xff1a;2021-02-16 13:08:40一、Lambda表达式简介Lambda表达式&#xff0c;是Java8的一个新特性&#xff0c;也是Java8中最值得学习的新特性之一。(另一个新特性是流式编程。)Lambda…

python中的event_Python event

最新项目游戏感用于SteelSeries GameSense 3.8.x的Python库安装这个包有两个不同的版本。一个支持普通的同步函数调用&#xff0c;另一个支持python的异步功能。要安装同步版本&#xff0c;请运 ...2021-03-02已阅读: n次此模块验证事件模块中的电话号码&#xff0c;就像base_p…

centos的mysql怎么删用户_linux/centos给Mysql创建用户、授权、查看、删除、修改密码、撤...

linux/centos给Mysql创建用户、授权、查看、删除、修改密码、撤linux/centos给Mysql创建用户、授权、查看、删除、修改密码、撤销权限linux/centos给Mysql创建用户、授权、查看、删除、修改密码、撤销权限root权限高&#xff0c;安全性考虑&#xff0c;一般只允许本地(本机)访问…

采取 过滤 php_这3种php高级过滤了解一下,很实用!

在php中有很多的过滤&#xff0c;可以对输入的字符串进行过滤&#xff0c;同时也可以对邮件地址进行过滤&#xff0c;接下来我要讲的是php中的3种高级过滤&#xff0c;在开发中很实用。第一种&#xff1a;过滤数值范围在php经常要接收各种数据&#xff0c;其中数值是非常普遍的…

吃PHP小孩智力好,这7种鱼千万不能给孩子吃,会影响孩子的智力!

所以&#xff0c;给宝宝添加鱼类时一定要注意&#xff0c;有7种鱼含有大量金属元素&#xff0c;是千万不能给宝宝吃的&#xff01;1罗非鱼罗非鱼深青色的外表有几分像鲫鱼。由于罗非鱼的成长周期较长&#xff0c;它们体内汞的含量也就相比其他鱼偏高&#xff0c;小朋友吃罗非鱼…

java监控rabbitMq服务状态,spring cloud 的监控turbine-rabbitmq的示例

前提是你已经有了注册中心,然后搭建一个基础spring cloud 服务,并配置注册服务等等前提环境搭建接下来描述的服务提供者和服务调用者的配置都是一样的,来自《spring cloud 与 docker微服务架构实战》的读后的个人总结.pom文件中需要引入spring-cloud-starter-hystrix/spring-cl…

java弹球轨迹运动解说,动态弹球的实现 加入了多线程技术-javaSE游戏准备工作

动态弹球的实现 加入了多线程技术--javaSE游戏准备工作任务描述:实现了动态弹球的功能&#xff0c;对于有弹球功能的SE游戏奠定了基础。package 运用线程技术的小球;import java.awt.*;import java.awt.event.*;import java.awt.geom.*;//不清楚这个有什么用import java.util.*…

asp php 用户登录,一个简单的asp.net 单点登录实现

以下是实现的效果图&#xff1a;首先上图的点击火车订票链接&#xff0c;就会打开http://学生信息平台网站/LoginToTrainSite.asa页面。LoginToTrainSite.asa页面的大致代码如下&#xff1a;Response.Buffer TrueResponse.ExpiresAbsolute Now() - 1Response.Expires 0Respo…

ajax怎么发送数据给php,ajax怎么发送数据给php

在网上看了很久&#xff0c;发现数据的利用ajax提交数据到后台其实很简单&#xff0c;但是很多讲解的并不清楚&#xff0c;对于初学者来说&#xff0c;很多真的是看着有点糊涂&#xff0c;拿来直接用&#xff0c;又想去了解怎么回事&#xff0c;其实利用ajax提交数据到后台是非…

oracle10无法安装打开,64位win10添加oracle odbc驱动时提示无法加载oracle怎么办

对于win10 64位系统添加oracle odbc驱动时提示无法加载oracle的问题相信部分用户都应该有所了解了&#xff0c;但是对于如何解决这个问题的实际操作的用户来说可能不多&#xff0c;因此&#xff0c;为了帮助出现这种问题的用户&#xff0c;小编在这里就来教大家64位win10添加or…

linux postgresql默认安装目录,postgresql - 三种安装方式(示例代码)

最近接触了postgresql的安装&#xff0c;和大家分享一下。一、简 介PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS)&#xff0c;也是目前功能最强大&#xff0c;特性最丰富和最复杂的自由软件数据库系统。有些特性甚至连商业数据库都不具备。这个起源于伯克利(…

linux中央服务器,如何在Linux上搭建一个Git中央仓库

前言&#xff1a;本教程只面向那些个人开发者&#xff0c;想要自己在linux上搭建一个git中央仓库用来上传发布自己的项目。但是对于团队来说可能有更高的要求&#xff0c;可以使用gitlab搭建一个可视化的类似github的版本管理系统测试环境我使用的linux版本是Centos7&#xff0…

linux桌面发展方向,观点|Linux 桌面的发展之路!

Ken Starks 在 fossforce.com 网站上问 你们是如何优化 Linux 的&#xff1f;&#xff0c;我很高兴他问了这个问题&#xff0c;因为我有话要说&#xff01;对我来说&#xff0c;Linux 桌面就是一连串的承诺&#xff0c;但是这些承诺却总是无法兑现。它在每个版本发布后都会说“…

linux常见基础服务,常用的linux命令的基本使用(一)

序号命令对应英文作用01lslist查看当前文件夹下的内容02pwdprint name of of current/working directory查看当前所在文件夹03cd[目录名]change directory切换文件夹04touch[目录名]touch如果文件不存在&#xff0c;新建文件05mkdir[目录名]make directory创建目录06rm[文件名]…

树莓派怎么学linux,树莓派使用入门用树莓派学 Linux

树莓派使用入门用树莓派学 Linux我们的《树莓派使用入门》的第四篇文章将进入到 Linux 命令行。在本系列的 第三篇文章 中开始了我们的树莓派探索之旅&#xff0c;我分享了如何安装 Raspbian&#xff0c;它是树莓派的官方 Linux 版本。现在&#xff0c;你已经安装好了 Raspbian…

全国计算机二级C语言过关要求,计算机二级考试c语言过关经验

计算机二级考试c语言过关经验考试要求考生在规定的时间内按指定的方式解答精心选定的题目或按主办方的要求完成一定的实际操作的任务&#xff0c;并由主办方评定其结果&#xff0c;从而为主办方提供考生某方面的知识或技能状况的信息。下面是小编整理的关于计算机二级考试c语言…

c语言链表贪吃蛇脚本之家,C++控制台实现贪吃蛇游戏

本文实例为大家分享了C实现贪吃蛇游戏的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下刚学完了C语言&#xff0c;便尝试的写了贪吃蛇的代码&#xff0c;但是效果不佳&#xff0c;很多的bug&#xff0c;所以&#xff0c;这个学了C&#xff0c;便重新的写了这个小游戏…

win8能开发android的sdk么,Win8下Android SDK安装与环境变量配置教程

Win8下Android SDK的安装与环境变量配置&#xff0c;具体内容如下1、下载Android SDK&#xff0c;点击安装&#xff0c;直接默认路径即可&#xff01;进入该网站后往下拉就能找到sdk下载的位置&#xff0c;选择图中红圈的程序进行下载2、安装过程比较简单&#xff0c;按照平时安…