C#实现日历样式的下拉式计算器
C#实现日历样式的下拉式计算器
原文地址:http://developer.51cto.com/art/201508/487486.htm
如果我们正在做一个类似于库存控制和计费系统的项目,有些部分可能必须手动计算数值。因此,用户就不得不使用计算器得到结果,再填入到输入字段中,或者在工作窗口上单独打开一个计算器窗口。总之,各种不便和麻烦。
- 本文介绍了如何在Visual Studio中创建用户控件来显示下拉式计算器,弹出效果类似于日历控件。
介绍
如果我们正在做一个类似于库存控制和计费系统的项目,有些部分可能必须手动计算数值。因此,用户就不得不使用计算器得到结果,再填入到输入字段中,或者在工作窗口上单独打开一个计算器窗口。总之,各种不便和麻烦。
这篇文章主要描述的是如何添加下拉式计算器到DataGridView单元格中,如下图:


使用代码
第一步,我们必须先创建一个函数计算器,并且能够使用控件。因此,不妨先创建一个Visual Studio用户自定义控件。怎么做呢?打开VS,创建一个新的Windows窗体应用程序(甚至你也可以在你当前的项目中这么做,但最好能分开,然后结合)。
然后,在Solution Explorer中,右键单击项目,选择add->User Control。命名(这里使用“CalculatorControl”),并添加。这时会给你一个像工作空间一样的Windows窗体。在它上面,用控件工具箱中的TextBox和Button创建一个计算器的布局。布局越小越好(想想日历控件),因为这就是个计算器而已。

为了快速搞定计算器功能,可以点击这里下载NCal(确保下载二进制文件),并添加到项目的引用文件中。
实现每个数字按钮的点击事件,将对应的数字输入/(追加)到文本框中,然后用同样的方式实现其他按钮,如+,X,/…并把对应的符号输入/(追加)到文本框中…
例如在文本框中输入:2 * 3 + 4
然后使用下面的代码来验证表达式,并得到结果:
- //
- using System.Windows.Forms;
- using NCalc;
- //
- string resText;
- bool eqPressed;
- double result;
- public void btnEqual_Click(object sender, EventArgs e)
- {
- Expression ex = new Expression(textBox1.Text);
- if (ex.HasErrors())
- {
- //Invalid Expression
- }
- else
- {
- result = Convert.ToDouble(ex.Evaluate());
- resText = result.ToString();
- }
- textBox1.Text = resText;
- text = resText;
- eqPressed = true;
- }
- //
现在计算器功能已经完成。直接构建解决方案,那么你可能会发现用户控件显示在工具箱顶部。你可以添加Windows窗体,拖放用户控件到窗体中运行,看看能否正常工作。
然后,在你想要添加下拉式计算器的项目中,创建另一个只有一个小按钮的用户控件。这个按钮将被用于打开计算器。
添加CalculatorControl内置引用文件到项目中。
创建一个新的继承ToolStripDropDown的类:
- using System.Windows.Forms;
- class CalDrop : ToolStripDropDown
- {
- Control content;
- ToolStripControlHost drop;
- public CalDrop(CalculatorControl content)
- {
- this.content = content;
- this.drop= new System.Windows.Forms.ToolStripControlHost(content);
- //Add the host to the list
- this.Items.Add(this.drop);
- }
- }
在按钮的单击事件中添加以下代码:
- private void button1_Click(object sender, EventArgs e)
- {
- CalculatorControl calculator = new CalculatorControl();
- CalDrop cal = new CalDrop(calculator);
- Point controlLoc = fm.PointToScreen(button1.Location);
- Point relativeLoc = new Point(controlLoc.X + button1.Width + 100,
- controlLoc.Y + button1.Height * 2);
- Rectangle calRect = button1.DisplayRectangle;
- cal.Show(locPoint);
- }
添加控件到DataGridViewCell
在你构建解决方案时,新的按钮控件会出现在工具箱中。添加以下代码到项目的窗体类中。
- private CalculatorPick calculator;
- public form1()
- {
- calculator = new CalculatorPick();
- calculator.Visible = false;
- dataGridView2.Controls.Add(calculator);
- }
- private void dataGridView2_CellClick(object sender, DataGridViewCellEventArgs e)
- {
- if (e.ColumnIndex == clmCommision.Index)
- {
- Rectangle calRect = dataGridView2.GetCellDisplayRectangle
- (e.ColumnIndex, e.RowIndex,false);
- Point p = calculator.FindForm().PointToClient
- (calculator.Parent.PointToScreen(calculator.Location));
- p.X -= calculator.Width/3;
- p.Y += calculator.Height;
- calculator.LocPoint = p;
- calculator.Width = calRect.Width/3;
- calculator.Height = calRect.Height;
- calculator.Visible = true;
- calculator.Calculator.btnEqual.Click += new EventHandler(calculatorBtnEqlClicked);
- }
- else
- if(calculator!=null)
- calculator.Visible = false;
- }
- void calculatorBtnEqlClicked(object sender, EventArgs e)
- {
- dataGridView2.CurrentCell.Value = calculator.Calculator.Result.ToString();
- }
兴趣点
本技巧描述的是添加控件到DataGridView中,可以让界面显得更为互动。
许可证
这篇文章中任何相关的源代码和文件,都是在The Code Project Open License (CPOL)许可下的。
C#实现日历样式的下拉式计算器的更多相关文章
- PropertyGrid—为复杂属性提供下拉式编辑框和弹出式编辑框
零.引言 PropertyGrid中我们经常看到一些下拉式的编辑方式(Color属性)和弹出式编辑框(字体),这些都是为一些复杂的属性提供的编辑方式,本文主要说明如何实现这样的编辑方式. 一.为属性提 ...
- Web前端开发实战1:二级下拉式菜单之CSS实现
二级下拉式菜单在各大学校站点.电商类站点.新闻类站点等大型?站点非经常见,那么它的实现原理是什么呢? 学习了Web前端开发的知识后,我们是能够实现这种功能的.复杂的都是从基础效果上加入做出来的.原理和 ...
- Web前端开发实战2:二级下拉式菜单之JS实现
上一篇博文提到了二级下拉式菜单是用HTML和CSS实现的.我们这一篇来用JavaScript脚本实现下拉菜单的显 示和隐藏. 使用 JavaScript方法实现我们须要用的知识有: 1)JS事件:on ...
- (转载)一个用于Gnome桌面的下拉式终端: Guake 0.7.0 发布
转自:https://linux.cn/article-5507-1.html Linux的命令行是最好.最强大的东西,它使新手着迷,并为老手和极客的提供极其强大的功能.那些在服务器和生产环境下工作的 ...
- 为下拉式菜单(DropDownList)添加第一个选项
很多方法可以为为下拉式菜单(DropDownList)添加第一个选项,下面是Insus.NET小结了几个方法,仅供参考: Html code: <body> <form id= ...
- 使用ActionBar实现下拉式导航
ActionBar除可提供Tab导航支持之外,还提供了下拉式(DropDown)导航方式.下拉式导航的ActionBar在顶端生成下拉列表框,当用户单击某个列表项时,系统根据用户单击事件导航指定Fra ...
- 令人眼前一亮的下拉式终端 Tilda & Guake
前言 老夫是 Linux 的老用户. 大一的时候某不方便透露姓名的校内组织给了一个 Fedora 13 的安装光盘,然后老夫学会了重装 Windows. 大二的时候知道了 Ubuntu ,开始在虚拟机 ...
- 用JavaScript+css制作下拉式菜单
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Gnome桌面的下拉式终端: Guake
什么是Guake? Guake是应用于Gnome环境的下拉式终端.主要由Python编写,使用了一些C,它以GPL2+许可证发布,适用于Linux以及类似的系统.Guake的灵感来源于电脑游戏Quak ...
随机推荐
- web容器与web服务器
apache.nginx 这类是web服务器tomcat.jboss.Kestrel(asp.net core) 这类是web容器而iis.jexus 两者都是 apache.nginx 是不能直接跑 ...
- Storm-源码分析-LocalState (backtype.storm.utils)
LocalState A simple, durable, atomic K/V database. *Very inefficient*, should only be used for occas ...
- 并发编程 - IO模型 - 1.io模型/2.阻塞io/3.非阻塞io/4.多路复用io
1.io模型提交任务得方式: 同步:提交完任务,等结果,执行下一个任务 异步:提交完,接着执行,异步 + 回调 异步不等结果,提交完任务,任务执行完后,会自动触发回调函数同步不等于阻塞: 阻塞:遇到i ...
- kafka-stream数据清洗
1.数据清洗业务类LogProcessor package com.css.kafka.kafka_stream; import org.apache.kafka.streams.processor. ...
- 一条SQL引起的雪崩
1.问题描述 MySQL服务器卡死,CPU飚到300%多,命令执行缓慢. 2.问题定位 踩了狗屎运,直接找到了问题缘由 发现了一条SQL写的模糊匹配,将%写在了关键字的前面,这样会造成查询不使用索引, ...
- MFC工具栏设计
工具栏中包含了一组用于执行命令的按钮,每个按钮都用一个图标来表示.当单击某个按钮时,会产生一个相应的消息,对这个消息的处理就是按钮的功能实现.将菜单中常用的功能放置在工具栏中,这样可以方便用户操作,省 ...
- 如何查看java class文件的jdk版本
方法1: 用二进制的查看方式打开该class文件,参考如下: 只看第一行数据,前面8个字节CA FE BA BE 是固定的,之后4个字节00 00 是次版本号,次版本号后面的4个字节(00 33) ...
- 虚拟机——安装虚拟机时,提示intel VT-x处于禁用状态
1.联想Lenovo扬天T4900C-00安转虚拟机提示: 按F12进入bios模式,修改Intel VT-x为启用,BIOS中依次选择:Advanced(高级)——CPU Configuration ...
- [golang note] 类型系统
值和引用 • 值语义和引用语义 值语义和引用语义的差别在于赋值: b = a b.Modify() 如果b的修改不会影响a的值,那么属于值类型,否则属于引用类型. • 值类型和引用类型 √ 引用类型一 ...
- tcp五层模型
物理层由来:上面提到,孤立的计算机之间要想一起玩,就必须接入internet,言外之意就是计算机之间必须完成组网 物理层功能:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字 ...