使用C#语言实现的查询条件界面展开和收起功能

先简单说一下应用场景,现有一个C#客户端的查询界面,上方放置查询条件,下方放置查询结果。因为实际情况中查询条件可能占了好几行的位置,所以希望在界面上默认只保留一行最主要的查询条件,并在右侧有一个“展开/收起”功能。

收起时界面:

展开时界面:

最开始我的实现方式是这样的,在界面上放置一个LinkLabel,设置此LinkLabel的鼠标单击事件,调整查询条件所在Panel的Height属性。

C#代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace SatyrAndNymph
{
public partial class FormMethod1 : Form
{
//收起状态时Panel高度
private const int HeightWhenFold = 50;
//收起状态时LinkLabel显示文字
private const string DescriptionWhenFold = "展开";
//展开状态时Panel高度
private const int HeightWhenExpand = 85;
//展开状态时LinkLabel显示文字
private const string DescriptionWhenExpand = "收起";
/// <summary>
/// 窗体构造函数
/// </summary>
public FormMethod1()
{
InitializeComponent();
//构造函数后将Panel调整为收起状态
lnkControlHeight.Text = DescriptionWhenFold;
pnlQueryConds.Height = HeightWhenFold;
}
/// <summary>
/// LinkLabel单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lnkControlHeight_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
//根据显示文字为展开/收起,调整Panel的高度及LinkLabel展示文字
if (lnkControlHeight.Text == DescriptionWhenFold)
{
lnkControlHeight.Text = DescriptionWhenExpand;
pnlQueryConds.Height = HeightWhenExpand;
}
else if (lnkControlHeight.Text == DescriptionWhenExpand)
{
lnkControlHeight.Text = DescriptionWhenFold;
pnlQueryConds.Height = HeightWhenFold;
}
}
}
}

不过我认为这样处理还是不够完美:每次使用都需要专门创建一个LinkLabel,并且每个页面的代码都不一样,因为父容器的标识符是不一样的。

为了解决这两个问题,我设计了一个自定义控件以方便后续的开发工作。

控件名为HeightController,界面如下:

自定义控件中只包含一个LinkLabel,AutoSize属性被设置为False,Dock属性被设置为Full,TextAlign属性被设置为MiddleLeft。

C#代码如下:

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 SatyrAndNymph
{
/// <summary>
/// 展开/收起控制器
/// </summary>
public partial class HeightController : UserControl
{
/// <summary>
/// 展开/收起控制器
/// </summary>
public HeightController()
{
InitializeComponent();
}
private void HeightController_Load(object sender, EventArgs e)
{
//设计器模式时,不触发展开/收起,否则会对设计工作造成干扰
if (!this.DesignMode)
{
//调整展开/收起情况
if (ControllerStatus == ControllerStatusEnum.FOLD)
{
Fold();
}
else if (ControllerStatus == ControllerStatusEnum.EXPAND)
{
Expand();
}
}
}
/// <summary>
/// 控制器状态
/// </summary>
private ControllerStatusEnum _controllerStatus = ControllerStatusEnum.FOLD;
///<summary>
/// 控制器状态
///</summary>
[System.ComponentModel.Description("控制器状态")]
public ControllerStatusEnum ControllerStatus
{
get
{
return _controllerStatus;
}
set
{
_controllerStatus = value;
}
}
/// <summary>
/// 父容器展开
/// </summary>
public void Expand()
{
ControllerStatus = ControllerStatusEnum.EXPAND;
if (this.Parent != null)
{
this.Parent.Height = HeightWhenExpand;
}
this.lnkHeightController.Text = DescriptionWhenExpand;
}
/// <summary>
/// 父容器收起
/// </summary>
public void Fold()
{
ControllerStatus = ControllerStatusEnum.FOLD;
if (this.Parent != null)
{
this.Parent.Height = HeightWhenFold;
}
this.lnkHeightController.Text = DescriptionWhenFold;
}
/// <summary>
/// 收起时高度
/// </summary>
private int _heightWhenFold = 50;
///<summary>
/// 收起时高度
///</summary>
[DefaultValue(50)]
[System.ComponentModel.Description("收起时高度")]
public int HeightWhenFold
{
get
{
return _heightWhenFold;
}
set
{
_heightWhenFold = value;
}
}
/// <summary>
/// 收起时显示文字
/// </summary>
private string _descriptionWhenFold = "展开";
///<summary>
/// 收起时显示文字
///</summary>
[System.ComponentModel.Description("收起时显示文字")]
public string DescriptionWhenFold
{
get
{
return _descriptionWhenFold;
}
set
{
_descriptionWhenFold = value;
}
}
/// <summary>
/// 展开时高度
/// </summary>
private int _heightWhenExpand = 85;
///<summary>
/// 展开时高度
///</summary>
[DefaultValue(85)]
[System.ComponentModel.Description("展开时高度")]
public int HeightWhenExpand
{
get
{
return _heightWhenExpand;
}
set
{
_heightWhenExpand = value;
}
}
/// <summary>
/// 展开时显示文字
/// </summary>
private string _descriptionWhenExpand = "收起";
///<summary>
/// 展开时显示文字
///</summary>
[System.ComponentModel.Description("展开时显示文字")]
public string DescriptionWhenExpand
{
get
{
return _descriptionWhenExpand;
}
set
{
_descriptionWhenExpand = value;
}
}
/// <summary>
/// 点击LinkLabel文字
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lnkHeightController_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
if (this.Parent != null)
{
int height = this.Parent.Height;
//根据父容器高度判断父容器应是收起还是展开
if (ControllerStatus == ControllerStatusEnum.FOLD)
{
Expand();
}
else
{
Fold();
}
}
}
}
}

使用此控件时,直接将此控件拖入要改变高度的Panel或其他容器即可。

使用前需要先在控件属性中设置好如下5项内容:

各属性说明如下:

1、ControllerStatus,是一个枚举,包含EXPAND和FOLD两种选择,决定窗体打开时查询条件是展开或是收起的。

2、DescriptionWhenExpand,当查询条件区域处于展开状态时,控制器展示的文字

3、DescriptionWhenFold,当查询条件区域处于收起状态时,控制器展示的文字

4、HeightWhenExpand,查询条件区域处于展开状态时高度

5、HeightWhenFold,查询条件区域处于收起状态时高度

HeightController控件使用效果如下:

收起时界面:

展开时界面:

DEMO程序下载地址:

链接: http://pan.baidu.com/s/1jHSvVee  密码: qfp7

以上所述是小编给大家介绍的使用C#语言实现的查询条件界面展开和收起功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • C#实现简单的登录界面

    首先我们来看一个简单的制作过程 打开visual 2010,新建窗体,既然是登录窗口,那么就不让它出现最大化.最小化以及拖拉大小功能(上一节已经提到过怎么设置大小),如图所示,甚至窗体的Text属性值为"登录窗口",大小随意. 创建窗体之后就开始界面详细的组件布局了,主要是在左边拖拉控件,然后放到窗体中去,定义属性值.这些都比较简单. 到了代码响应阶段,双击登录按钮,进入代码视图: private void button1_Click(object sender, EventArgs

  • C#中载入界面的常用方法

    本文实例讲述了C#中载入界面的常用方法.分享给大家供大家参考.具体方法分析如下: 方法1.采用事件委托的方法  对象:主窗体:FrmMain 加载窗体:FrmLoading  思路:  在主窗体加载前显示窗体FrmLoading,当主窗体加载完毕后(第一次显示的时候),关闭FrmLoading C#代码如下所示: 复制代码 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; usin

  • C#多线程与跨线程访问界面控件的方法

    本文实例讲述了C#多线程与跨线程访问界面控件的方法.分享给大家供大家参考.具体分析如下: 在编写WinForm访问WebService时,常会遇到因为网络延迟造成界面卡死的现象.启用新线程去访问WebService是一个可行的方法. 典型的,有下面的启动新线程示例: 复制代码 代码如下: private void LoadRemoteAppVersion()  {      if (FileName.Text.Trim() == "") return;      StatusLabel

  • C#中使用IrisSkin2.dll美化WinForm程序界面的方法

    一.添加控件IrisSkin2.dll.方法:        1.右键"工具箱"."添加选项卡",取名"皮肤".        2.右键"皮肤","选择项"弹出对话框        3.点击"浏览",找到IrisSkin2.dll,,next,next,确定.        4.在皮肤里会出现.        5.把SkinEngine拖到设计界面,会出现在下面. 二,把皮肤文件中以ss

  • 使用C#语言实现的查询条件界面展开和收起功能

    先简单说一下应用场景,现有一个C#客户端的查询界面,上方放置查询条件,下方放置查询结果.因为实际情况中查询条件可能占了好几行的位置,所以希望在界面上默认只保留一行最主要的查询条件,并在右侧有一个"展开/收起"功能. 收起时界面: 展开时界面: 最开始我的实现方式是这样的,在界面上放置一个LinkLabel,设置此LinkLabel的鼠标单击事件,调整查询条件所在Panel的Height属性. C#代码如下: using System; using System.Collections.

  • Go语言ORM包中使用worm构造查询条件的实例详解

    目录 构造查询条件 main函数 数据库表与数据模型 通过ID来查询数据 通过Where函数来查询数据 XXXIf查询 in.not in查询 嵌套查询语句 Limit与Offset orderby查询 构造查询条件 worm是一款方便易用的Go语言ORM库.worm支Model方式(持结构体字段映射).原生SQL以及SQLBuilder三种模式来操作数据库,并且Model方式.原生SQL以及SQLBuilder可混合使用. Model方式.SQL builder支持链式API,可使用Where

  • asp.net 网页动态查询条件的实现

    场景 最近有一个需求,会在 mongodb 中插入各种类型的数据,算是记录业务日志的数据库吧. 因为业务对象类型都不同,所以插入的数据格式也完全不同. 除此之外,还需要提供一个查询界面,可以搜索数据. 插入数据没任何问题,但是查询就- 查询设计方案 首先想到的是让用户直接输入 mongodb 查询语法,类似 json 格式.但是使用者虽然也是开发,可都不熟悉这个语法,所以放弃了. 第二个想法是让用户输入 SQL 语句,然后转换- 结果以失败而告终. 最后,看到了 iTunes 智能播放列表的交互

  • 浅述SQL Server的聚焦强制索引查询条件和Columnstore Index

    前言 本节我们再来穿插讲讲索引知识,后续再讲数据类型中的日期类型,简短的内容,深入的理解. 强制索引查询条件 前面我们也讲了一点强制索引查询的知识,本节我们再来完整的讲述下 (1)SQL Server使用默认索引 USE TSQL2012 GO SELECT * FROM Sales.Orders 上述就不用我再啰嗦了,使用默认主键创建的聚集索引来执行查询执行计划. (2)SQL Server使用强制索引 USE TSQL2012 GO SELECT custid FROM Sales.Orde

  • MVC+Bootstrap+Drapper使用PagedList.Mvc支持多查询条件分页

    前几天做一个小小小项目,使用了MVC+Bootstrap,以前做分页都是异步加载Mvc部分视图的方式,因为这个是小项目,就随便一点.一般的列表页面,少不了有查询条件,下面分享下Drapper+PagedList.Mvc支持多查询条件分页的使用经验. 在MVC中我们一般习惯使用强类型Model,通过分析Orders的展示页面,来构建这个Model. 1.查询参数的Model public class OrderQueryParamModel { /// <summary> /// 订单编号 //

  • ThinkPHP3.1新特性之查询条件预处理简介

    以往的ThinkPHP3.0版本对数组方式的查询条件会进行安全过滤(这是由于3.0强制使用了字段类型检测,所以数组方式的查询条件会强制转换为字段的设定类型),但是3.0版本并不支持字符串条件的安全过滤.而ThinkPHP3.1版本则增加了对条件字符串进行预处理的支持,让ORM的安全性更加得以保证. 一.使用where方法 Model类的where方法支持字符串条件预处理,使用方式: $Model->where("id=%d and username='%s' and xx='%f'&quo

  • SQL 复合查询条件(AND,OR,NOT)对NULL值的处理方法

    NULL值影响查询条件的结果,并且结果很微妙. 以下是SQL中AND,OR,NOT的真值表. 表1    AND的真值表 TRUE FALSE NULL TRUE TRUE FALSE NULL FALSE FALSE FALSE FALSE NULL NULL FALSE NULL                                               表2    OR的真值表 TRUE FALSE NULL TRUE TRUE TRUE TRUE FALSE TRUE F

  • 存储过程实现(可带查询条件/万能分页/通用)

    假设数据库中有张表,表名是UserName,字段分别是ID(int),Name(nvarchar),Age(int). 如果不带查询条件存储过程是: 复制代码 代码如下: CREATE PROCEDURE [dbo].[UserName] @pageIndex int, @pageSize int AS declare @min int; declare @max int; set @min=@pageSize*(@pageIndex-1)+1; set @max=@pageSize*@page

  • jQuery Datatable 多个查询条件自定义提交事件(推荐)

    先写2个input 分别表示开始时间跟结束时间 在写一个button 点击按钮 让表格重新刷新 代码如下 如下所示在datatable设置项增加如下设置  如果已经有了  只需要添加如下的data选项 ajax: { url: '/admin/index', type: 'POST', "data": function ( d ) { //添加额外的参数传给服务器 d.beginDate = $("#datetimepicker1").val(); d.endDat

  • datatables 带查询条件java服务端分页处理实例

    使用datatables自带后台查询 前台代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico" rel="external nof

随机推荐