自定义控件基础知识(通用8篇)
篇1:自定义控件基础知识
基于模版的简单控件<%@ Page language=“c#” Codebehind=“WebForm1.aspx.cs” AutoEventWireup=“false” Inherits=“WebApp3.WebForm1” %><%@ Register TagPrefix=“MY” NameSpace=“WebApp3” Assembly=“WebApp3” %>WebForm1“ Runat=server>
.csprivate void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 if(!this.Page.IsPostBack) DataBind; }
控件代码:
using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Drawing;using System.Web;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.HtmlControls;
namespace WebApp3{ ///
/// MyTemplateC 的摘要说明,
自定义控件(支持模板)
,///[ParseChildren(true)] public class MyTemplateC: Control,INamingContainer { private ITemplate itemPlate; [TemplateContainer(typeof(MyTemplateC))]//指定当前控件类型 public ITemplate ItemTemplate { get{return itemPlate;} set{itemPlate=value;} }
private string text; public string Text { get{return text;} set{text=value;} }
protected override void OnDataBinding(EventArgs e) { this.EnsureChildControls();//确定是否包含子控件,否则创建 base.OnDataBinding (e); }
protected override void CreateChildControls() { if(itemPlate!=null) { itemPlate.InstantiateIn(this);//当由类实现时,创建子控件对象 } else { this.Controls.Add(new LiteralControl(” NO TEMPLATE“)); } } }}
篇2:自定义控件基础知识
在实际开发中消息提示时很常见的需求,为了个性化和拥有简洁的UI状态栏提示是比较好的方案,好处很多如:不遮挡主UI,新意,下面贴出实现代码,
WHC_StatusBarMessage.h头文件如下:
//// WHCStatusBarMessage.m// WHCStatusBarMessage//// Created by apple on 14-3-28.// Copyright (c) apple. All rights reserved.//#import “WHC_StatusBarMessage.h”#define kPading (5.0) //边距#define kLogoWidth (15.0) //图标logo宽度@interface WHC_StatusBarMessage{ UILabel * msgLab; //消息标签 UIImageView * logoImgV; //logo图标对象 UIImage * logoImg; //logo图标 CGFloat height; //高度 CGFloat screenWidth; //屏幕宽度 CGFloat screenHeight; //屏幕高度}@property(nonatomic,retain)UILabel * statusLab;@property(nonatomic,retain)UIImageView * logImgView;@property(nonatomic,retain)NSTimer * runTimer; //停留时钟@end@implementation WHC_StatusBarMessagestatic WHC_StatusBarMessage * msb;//构建单例+(WHC_StatusBarMessage *)shareStatusBar{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ msb = [[WHC_StatusBarMessage alloc]init]; }); return msb;}//初始化UI-(id)init{ CGRect statusFrame. = [UIApplication sharedApplication].statusBarFrame; height = statusFrame.size.height; screenWidth = [UIScreen mainScreen].bounds.size.width; screenHeight = [UIScreen mainScreen].bounds.size.height; self = [super initWithFrame.:statusFrame]; if(self){ self.frame. = statusFrame; self.autoresizingMask = UIViewAutoresizingFlexibleWidth; self.windowLevel = UIWindowLevelStatusBar + 1.0; self.backgroundColor = kWHC_StatusBarMessageBack_Color; logoImg = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@“29x29” ofType:@“png”]]; logoImgV = [[UIImageView alloc]initWithFrame.:CGRectMake(kPading, kPading / 2.0, kLogoWidth, kLogoWidth)]; logoImgV.backgroundColor = [UIColor clearColor]; [self addSubview:logoImgV]; msgLab = [[UILabel alloc]initWithFrame.:CGRectMake(logoImgV.frame.origin.x + kPading + logoImgV.frame.size.width, 0.0, screenWidth - (logoImgV.frame.origin.x + kPading + logoImgV.frame.size.width), statusFrame.size.height)]; msgLab.backgroundColor = [UIColor clearColor]; msgLab.font = [UIFont systemFontOfSize:14.0]; msgLab.textColor = [UIColor whiteColor]; [self addSubview:msgLab]; //注册单击事件 UITapGestureRecognizer * tapStatusBar = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapTopBar:)]; [self addGestureRecognizer:tapStatusBar]; //注册状态栏方向监听事件 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(screenOrientationChange:) name:UIApplicationWillChangeStatusBarFrameNotification object:nil]; } return self;}//处理单击状态栏消息- (void)tapTopBar:(UITapGestureRecognizer *)tapGesture{ if(_whcStatusBardelegate && [_whcStatusBardelegate respondsToSelector:@selector(didTapTouchWHCStatusBarMessageDoSomething)]){ [_whcStatusBardelegate didTapTouchWHCStatusBarMessageDoSomething]; }}//显示状态栏消息-(void)showTextMessage:(NSString*)strMessage delayTime:(NSInteger)delay{ [self.runTimer invalidate]; self.runTimer = nil; if(logoImg == nil){ logoImg = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@“29x29” ofType:@“png”]]; } if(delay == -1) delay = 3; logoImgV.image = logoImg; msgLab.text = strMessage; __block CGRect stateFrame. = self.frame; stateFrame.origin.y = -20.0; self.frame. = stateFrame; [UIView animateWithDuration:0.2 animations:^{ stateFrame.origin.y = 0.0; self.frame. = stateFrame; }]; [self makeKeyAndVisible]; self.runTimer = [NSTimer scheduledTimerWithTimeInterval:delay target:self selector:@selector(dismissTimer) userInfo:nil repeats:NO];}-(void)showMessage:(NSString*)strMessage logImage:(UIImage *)logImage delayTime:(NSInteger)delay{ logoImg = logImage; [self showTextMessage:strMessage delayTime:delay];}-(void)dismissTimer{ double delayInSeconds = 0.3; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ msb.hidden = YES; });}#pragma mark - screenChange-(void)screenOrientationChange:(NSNotification*)notif{ UIInterfaceOrientation rientation = [[[notif userInfo] objectForKey:UIApplicationStatusBarOrientationUserInfoKey] integerValue]; switch (orientation) { case UIInterfaceOrientationPortrait:self.transform. = CGAffineTransformIdentity;self.frame. = CGRectMake(0.0, 0.0, screenWidth, height);break; case UIInterfaceOrientationPortraitUpsideDown:self.transform. = CGAffineTransformMakeRotation(M_PI);self.center = CGPointMake(screenWidth / 2.0, screenHeight - height / 2.0);self.bounds = CGRectMake(0.0, 0.0, screenWidth, height);break; case UIInterfaceOrientationLandscapeLeft:self.transform. = CGAffineTransformMakeRotation(-M_PI_2);self.center = CGPointMake(height / 2.0, screenHeight / 2.0);self.bounds = CGRectMake(0.0, 0.0, screenHeight, height);break; case UIInterfaceOrientationLandscapeRight:self.transform. = CGAffineTransformMakeRotation(M_PI_2);self.center = CGPointMake(screenWidth - height / 2.0, screenHeight / 2.0);self.bounds = CGRectMake(0.0, 0.0, screenHeight, height);break; default:break; }}@end
篇3:自定义控件基础知识
随着Internet的普及, 互联网已经成为人们日常生活的重要组成部分, 人们通过网络可以浏览新闻、阅读小说、实现购物等, 而这些行为的实现, 都需要相关网站包含有大量的信息, 并以网页的形式将相关信息呈现在用户面前, 但大量信息通过一个页面显示[1], 显然会影响用户的使用效果, 分页显示数据即可解决大量信息的显示问题, 从用户角度来说, 分页显示数据即实现了一个网页承载大量信息。而使用基于ASP.NET技术的自定义分页控件即可实现灵活设置当前页面显示信息数量的设置。
二、自定义分页控件的实现过程
2.1自定义分页控件的设计。可根据具体需求, 创建不同格式的分页控件, 本文实现的自定义分页控件实现了一般的分页功能, 即“首页”、“上一页”、“下一页”、“末页”以及显示当前页数及总页数。其中“首页”、“上一页”、“下一页”、“末页”可用Hyper Link控件加以实现, 当前页数及总页数可用Label控件加以实现, 另外为了方便分页控件的显示与隐藏可将以上控件放置在Panel控件中, 进行集中控制[2]。
2.2自定义分页控件功能实现
(1) 设置分页控件自定义设置项。一般来说, 分页控件的当前页面显示记录数, 数据源及数据呈现控件是需要灵活设置的, 所以在创建自定义分页控件时, 可将其设置为类成员变量, 并将其访问方式定义为private, 再创建其只读属性[3], 即可实现通过自定义分页控件实现以上信息的灵活设置。
数据呈现控件一般为Repeater控件或Data List控件等, 此文以数据绑定至Repeater控件为例, 代码如下:
(2) 应用Paged Data Source类实现对数据源数据的分页操作。通过Paged Data Source类实现对数据源数据的分页操作, 需要设置其分页对象数据源属性 (Data Source) 、允许分页属性 (Allow Paging) 、每页显示记录数属性 (Page Size) 、当前页码属性 (Current Page Index) 、总页码数属性 (Page Count) 等, 代码如下:
说明:“i Page Index”变量为当前页码变量, 此变量在分页实现控制实现过程中动态设置。
三、结语
应用该自定义分页控件, 可灵活设置分页显示数据, 控件引用方便, 编码简单, 对于中小规模数据量分页速度较快, 用户体验较好, 但对于数据量较大的页面建议使用SQL双Top查询实现。
参考文献
[1]金铁.浅议ASP.NET的分页技术[J].信息系统工程, 2012 (02) .
[2]庄新研.ASP.NET中实现数据分页的几种方法[J].电脑知识与技术, 2011 (07) .
篇4:C#开发自定义控件方法探讨
关键词:系统控件;自定义控件;软件开发
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)15-30797-02
Discussion of the Technique of Self-defined Controls Based on C#
YAO Ming,LI Jia-lan
(Dept. of Computer Science and Technology,Maoming University,Maoming 525000,China)
Abstract:To solve the lack of system-defined controls within current develop tools, with a developing instance of a self-defined control, the developing technique of self-defined controls is analyzed and discussed based on C#. This technique can be used for software development with special requirements.
Key words:system-defined control; self-defined control; software development
1 引言
使用C#进行项目开发时,其所提供的控件常常不能满足用户的特殊需求。例如,在进行报表软件的开发时,需要生成足够灵活并且与动态数据绑定的报表单元格元素控件,而C#所提供的系统控件不能满足开发要求。此时必须开发自定义控件。本文通过报表单元格元素控件的开发,对用C#开发自定义控件的一般方法进行探讨。
2 自定义控件简介
组件是指一段经常用到的公共代码,封装在某个单元模块中。在.Net Framework中,一个类通过实现System.ComponentModel.IComponent接口而成为组件[1]。
如果一个组件具有用户接口或界面,就称之为控件。控件可以直接通过界面与用户进行交互。控件的开发方法以面向对象方法为基础,它是界面、属性、方法、事件的一个封装。它实现了部分功能,能够被很好地调用。
用户通过继承和修改系统控件库所提供的控件,使其拥有新的属性、方法和事件处理,就可以得到自定义控件。
用C#可以开发两种不同类型的自定义控件[1]。其中一种是用户控件,开发中比较常见。这类控件一般用于把控件的用户界面和功能封装在一起,或者把几个其他控件组合在一起,改善控件的界面。这种控件继承自UserControl类,根据现有控件的功能创建而成。本文主要讨论这种控件的开发方法。
3 自定义控件的开发
自定义控件要具有系统原有控件的风格,同时还要实现用户的可操作性,则其必须在支持系统提供的专有接口的同时,对系统控件的功能进行扩展。总结其开发过程,可以分成四个阶段:自定义功能的提取、基础控件的选择、功能的实现和自定义控件的生成。
3.1 自定义功能的提取
自定义功能是指为满足用户的要求,系统对基础控件进行扩充的功能。自定义功能提取的目的,是明确自定义控件将要实现的功能和显示的信息,以便其与系统控件提供的功能相比较,选取合适的系统控件。设计中的报表单元格元素,在表现形式上就是控件。这种控件要求可以移动、改变大小、设置边框;可以设置背景颜色/图片;可以绑定动态数据,能够显示文字或数据。因此,有待开发的控件必须具有上述的功能特点。
选取功能需求之后,需要对其进行分析。对于某些系统控件可以提供的功能不予考虑,重点分析系统控件没有提供的功能,提取那些需要做很大改动或难以实现的功能作为该控件的特征功能。在报表单元格元素控件的功能要求中,背景的设置和文字的显示不予考虑,大小的改变可以在系统控件的基础上进行比较小的改动,也不予考虑,所以其特征功能就是移动、边框设置和数据绑定。特征功能将作为功能的实现的重要目标,而非特征功能将作为基础控件的选择依据。
3.2 基础控件的选择
根据前一阶段中提到的非特征功能,比较现有系统控件提供的基本功能,选择符合条件最多的作为基础控件。一般在选择基础控件的时候,优先选择常用的控件。根据前面的分析,考虑能进行背景设置和文字显示的常见控件是TextBox,因此该单元格元素的基础控件选择TextBox。
3.3 自定义功能的实现
自定义功能的实现是自定义控件开发中的关键,要求自定义控件对原有的控件进行重载,添加自定义属性,实现自定义事件处理,通过事件的响应和属性的设置来满足用户要求。
报表单元格元素控件必须为设计者(用户)提供自由设计报表的各种条件,用户根据自己的需要对报表元素(控件)进行各种操作,从而达到自己满意的效果。根据这种要求,对原有的控件进行重载,添加自定义属性、自定义事件,通过事件的响应和属性的设置来满足用户要求。功能的具体实现过程为:首先扩展控件的基类型,然后添加自定义属性,编写自定义事件的处理程序。
3.3.1 扩展系统控件
原有功能的扩展是对某些系统控件提供的功能进行改进的过程。其具体实现方法是重载被扩展功能所对应的基类方法。对于报表单元格,其位置、大小等的改变都是通过用户的鼠标操作来引发的。系统监听属性框,一旦用户手动更改控件的属性值,系统将自动判断更改的属性值,并及时更改该属性对应的表现形式,同时系统还将更改并保存控件对应的属性值。在此应重载控件的鼠标事件类的相应方法OnMouseDown()与OnMouseUp(),当鼠标按下与鼠标松开时对自定义属性进行处理。
3.3.2 添加自定义属性
自定义控件需要自定义属性,以记录必要的信息。控件的属性是控件外在表现形式的数据(变量)表示。将变量转化为属性,方便了对这种数据的访问和安全控制。用户可以通过对属性的设置来更改控件的表现形式。为给用户提供更全面的信息,同时也为开发者降低实现难度,有时必须对原有控件的属性进行扩充。
在显示元素属性设置的实现时,控件生成以后,其属性便已经初始化,并显示在属性框中。一旦控件的属性更改,属性框的值也及时更新,并同时更改其表现形式。要实现边框的任意设置,控件需要添加边框属性。在用户对控件进行边框设置的时候,其属性值必须相应地改变,并且显示在界面上(用属性框显示)。属性的定义格式为:
//声明部分
private class_propertyTemp = new class(); //用于声明记录属性值的临时变量
//属性设置部分
pubic class PropertyName //PropertyName为属性在显示和使用时的名称
{
get {return_propertyTemp;} //获取属性值权限
set {_propertyTemp = value;} //设置属性值权限
}
3.3.3 编写自定义事件
自定义控件还需要自定义的事件处理程序来处理不同的事件,以达到用户需要的结果。用户在操作报表元素(控件)的时候,控件必须响应的事件包括拖拽、变大、缩小、选中变色、边框显示等。通过控件对这些事件的响应来改变其表现形式。C#中事件是通过委托机制来实现的。控件事件的处理过程为:控件通过监听鼠标事件,来判断当前鼠标将要进行的事件,将其对应的事件添加到事件委托中,等待事件的激活。一旦事件激活便自动执行事件处理程序[2]。事件处理完之后立即更新控件的属性,并能够显示在属性框中。自定义事件处理也必须按照此过程进行。在OnMouseDown()与OnMouseUp()方法中编写控件属性的处理过程如下:
public void OnMouseDown(object sender, MouseEventArgs e)
{
……
Process the propertyName; //对属性的处理过程
if(e.Button == System.Windows.Forms.MouseButtons.Left)
{
///向控件Control的鼠标移动MouseMove事件队列中添加由新建委托///MyMouseEventHandler处理的DragMouseMove事件。
this.Control.MouseMove += new MyMouseEventHandler(DragMouseMove); }
……}
public void OnMouseUp(object sender, MouseEventArgs e)
{……
this.propertyGrid.SelectedObject = this.Control.PropertyName;
//显示修改后的属性。this.propertyGrid表示属性框。
……}
报表元素控件需要特殊处理鼠标的拖拽,以完成控件的移动,大小改变等。OnMouseDown()方法事例代码中的if语句块表示当鼠标左键按下时,控件Control的拖拽事件DragMouseMove将被添加到其新建的事件委托MyMouseEventHandler中,等待激活。当鼠标开始移动时,事件DragMouseMove被激活,系统自动运行DragMouseMove中的事件处理程序,对控件的位置以及顶点坐标处理:
public void DragMouseMove(object sender, MouseEventArgs e)
{this.Location = new Point(this.Location.X + e.X - tempX,this.Location.Y + e.Y - tempY);
this.Left = this.Location.X;
this.Top = this.Location.Y;}
新建事件委托部分代码如下:
//声明并实例化一个鼠标事件委托。
public delegate void MyMouseEventHandler(object sender, MouseEventArgs e);
public event MyMouseEventHandler myMouseEventHandler;
由于新建委托的事件列表类型是系统提供的鼠标事件MouseEventArgs,因此该委托的事件处理过程与系统的鼠标事件处理过程相同。如果使用自己定义的处理过程来处理事件,则须重写这个事件列表。有关委托的内容可参看文献[3]。
3.4 自定义控件的生成
完成了上述工作之后,再编译生成DLL文件,即自定义控件的生成。生成后的自定义控件可以像其他控件一样被应用程序正常调用。很多开发环境都为开发者提供了控件的生成这项功能。在.Net环境只需一步操作就可以得到控件的DLL文件。在需要用到的时候直接引用该DLL文件即可。
4 自定义控件应用中的注意点
由于自定义控件实现了特殊的功能,而这些功能必定牵涉到某些特殊的数据。要保证自定义控件运行的正确性,必须要保证控件操作的数据的准确性。对于已经提供组件扩展功能的.Net开发平台,自定义控件的引用可以参考帮助文档,按规定步骤操作即可。
一般大型的应用程序都包含多个区域。各个区域之间必然存在某些联系,而这些联系也将影响到控件在各窗口之间的调用[4]。窗口间的调用主要发生在控件的操作和属性的同步显示时。控件的操作必将影响到控件的属性值,而属性的显示必须使用到这些属性值。要解决调用问题,则要通过事件与委托。委托可以使事件源与控件处于不同区域中。这样就可以保证对控件的操作与其属性值保持同步。
窗口间的调用问题还表现在不同窗口间的数据的传递。当两个处在不同区域或层次上的控件(包括系统控件)共同处理同一数据时,窗口间的值传递问题便产生。可以通过参数形式的值/引用传递来实现数据共用或通过公用类存储数据这两种不同的解决方案来实现数据共用。前者实现方法简单直接,实现目的明确,但传递的数据不宜过多,数据的安全性较差,一旦数据作为参数传递给方法,方法即可对其进行一些危险的操作,因此开发者必须在方法中对这种操作加以限制;后者比较容易控制数据在不同空间使用时的安全性,而且适合各种数据形式,但实现起来比较麻烦。
5 结束语
使用C#在一些专业领域的软件开发中,由于用户有特殊要求,常要进行自定义控件的开发。自定义控件开发的主要技术要点是添加自定义属性和编写自定义事件处理,其中编写自定义事件处理程序是自定义控件开发的核心部分。自定义控件可以像其它系统控件一样使用,但是须注意控件所对应的数据的正确性以及与其它窗口之间的调用问题。
参考文献:
[1]Karli Watson,Marco Bellinaso,等. 康博,译. C#入门经典[M]. 北京:清华大学出版社,2002:577,365.
[2]Richard Wiener. Delegates and Events in C#[J]. JOURNAL OF OBJECT TECHNOLOGY, 2004,3(5):78-85.
[3]何卓华, 唐平. Visual C#中委托特性的原理及其应用[J]. 现代计算机, 2003,141:65-67.
篇5:自定义控件基础知识
WHC_RadioButton.h头文件如下:
//// WHC_RadioButton.h// CTBMobileBank//// Created by 吴海超 on 15/4/1.////#import#define KWHC_IMAGE_SIZE (15.0) //图标尺寸@interface WHC_RadioButton : UIButton@end
WHC_RadioButton.m源文件如下:
篇6:自定义控件基础知识
java.lang.IllegalStateException: onMeasure did not set the measured dimension by calling setMeasuredDimension()
-待填充-
篇7:Word 基础:删除自定义库
第1步,打开Word 2007窗口,并切换到“插入”功能区,在“页眉和页脚”分组中单击“页眉”按钮下面的三角按钮。
第2步,在打开的Word 2007页眉库中右键单击用户添加的自定义库,并单击快捷菜单中的“整理和删除”命令,如图所示,
Word 2007单击“整理和删除”命令
第3步,打开Word 2007“构建基块管理器”对话框,单击“删除”按钮。在打开的是否确认删除提示框中单击“是”按钮,并单击“关闭”按钮即可,如图所示。
Word 2007“构建基块管理器”对话框
篇8:自定义控件基础知识
小贴士
在默认的情况下,窗体控件工具箱中仅给出了常见的几个控件,事实上,VBA的控件数量远不止这些,用户可以根据需要在控件工具箱上添加一些标准控件或自定义控件,也可以随时删除它们。
在录入用户的出生日期或查询某个日期的数据时,我们经常会用到日历控件或者日期控件。
在Excel VBA窗体的工具箱中没有提供日历控件,首次使用该控件时需要将其添加到窗体工具箱中。添加的方法是:打开VBE编辑器,首先在当前工作簿中插入一个用户窗体。接下来单击“工具”菜单的“附加控件”命令,打开“可用控件”对话框,在“可用控件”列表框中选择“日历控件 11.0”(Office版本为2003),单击“确定”按钮。此时在窗体工具箱中多出了一个“Calendar”(日历) 控件。
实现的方法是:按“Alt+F11”组合键打开VBE编辑器,在当前工作簿中插入一个用户窗体,利用日历控件和按钮控件设计的用户界面(如图1)。双击窗体中的命令按钮,在其Click事件中编写下面的代码:
Private Sub CommandButton1_Click()
ActiveCell.Value = Calendar1.Value
UserForm1.Hide
End Sub
双击当前的工作表(如sheet1),在其SelectionChange事件中编写下面的代码:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'判断用户选中的是否为第3列
If Target.Column = 3 Then
UserForm1.Show
End If
End Sub
输入数据时,当用户将光标移到到第3列即出生日期所在列时自动弹出用户窗体,用户选择完日期并单击“插入日期”按钮后,所选日期自动插入到当前的单元格中,同时用户窗体自动隐藏。这样,大家就可以方便地录入日期数据了。
小贴士
与其它可编程控件一样,日历也有很多的属性,如:BackColor属性可用来设置日历控件的背景色;Year、Month和Day属性可用来提取所选日历的年份、月份和日期;Value属性用于显示用户在日历控件中选定的日期值等。
DTPicker 日期控件
与日历控件一样,日期控件也是一个用来获取日期的控件,功能大致相同,但操作界面与日历控件略有区别,该控件在应用程序的开发中比日历控件应用更为常见。
首次使用日期控件时也需要将其添加到窗体工具箱中去,添加的方法与日历控件类似。日期控件的名字是“Microsoft Date and Time Picker Control 6.0 (SP4)”,其主要属性有:Format属性用于指定日期的显示格式;Value属性值与用户选定的日期值有关;Year、Month和Day属性可用来提取所选日期值的年份、月份和日期等。
使用窗体查询或采集数据时经常会遇到日期输入的问题。此时既可以手工输入日期数据,也可以单击列表框右侧的下拉按钮选择日期数据(如图2),系统可将用户选择的日期值回显到指定的文本框或其它对象中,从而方便了日期数据的查询或采集。
很多朋友设计的应用程序不仅操作方便,安装时有进度条提示,为了美观,他们有时还在窗体中插入变幻的Flash动画,这些功能到底又是如何实现的呢?
相关文章:
网银安全控件安装说明01-23
学校班主任工作经验交流总结01-23
我眼中的黑色作文01-23
作文:我眼中的“祭龙”01-23
我眼中的春节作文01-23
MFC控件关联变量小结01-23
ActiveX控件01-23
用户控件设计01-23
结肠癌患者01-23
数据显示控件01-23