C#实现日历样式的下拉式计算器

C#实现日历样式的下拉式计算器

原文地址:http://developer.51cto.com/art/201508/487486.htm

如果我们正在做一个类似于库存控制和计费系统的项目,有些部分可能必须手动计算数值。因此,用户就不得不使用计算器得到结果,再填入到输入字段中,或者在工作窗口上单独打开一个计算器窗口。总之,各种不便和麻烦。

本文介绍了如何在Visual Studio中创建用户控件来显示下拉式计算器,弹出效果类似于日历控件。

介绍

如果我们正在做一个类似于库存控制和计费系统的项目,有些部分可能必须手动计算数值。因此,用户就不得不使用计算器得到结果,再填入到输入字段中,或者在工作窗口上单独打开一个计算器窗口。总之,各种不便和麻烦。

这篇文章主要描述的是如何添加下拉式计算器到DataGridView单元格中,如下图:

使用代码

第一步,我们必须先创建一个函数计算器,并且能够使用控件。因此,不妨先创建一个Visual Studio用户自定义控件。怎么做呢?打开VS,创建一个新的Windows窗体应用程序(甚至你也可以在你当前的项目中这么做,但最好能分开,然后结合)。

然后,在Solution Explorer中,右键单击项目,选择add->User Control。命名(这里使用“CalculatorControl”),并添加。这时会给你一个像工作空间一样的Windows窗体。在它上面,用控件工具箱中的TextBoxButton创建一个计算器的布局。布局越小越好(想想日历控件),因为这就是个计算器而已。

为了快速搞定计算器功能,可以点击这里下载NCal(确保下载二进制文件),并添加到项目的引用文件中。

实现每个数字按钮的点击事件,将对应的数字输入/(追加)到文本框中,然后用同样的方式实现其他按钮,如+,X,/…并把对应的符号输入/(追加)到文本框中…

例如在文本框中输入:2 * 3 + 4

然后使用下面的代码来验证表达式,并得到结果:

  1. //
  2. using System.Windows.Forms;
  3. using NCalc;
  4. //
  5. string resText;
  6. bool eqPressed;
  7. double result;
  8. public void btnEqual_Click(object sender, EventArgs e)
  9. {
  10. Expression ex = new Expression(textBox1.Text);
  11. if (ex.HasErrors())
  12. {
  13. //Invalid Expression
  14. }
  15. else
  16. {
  17. result = Convert.ToDouble(ex.Evaluate());
  18. resText = result.ToString();
  19. }
  20. textBox1.Text = resText;
  21. text = resText;
  22. eqPressed = true;
  23. }
  24. //

现在计算器功能已经完成。直接构建解决方案,那么你可能会发现用户控件显示在工具箱顶部。你可以添加Windows窗体,拖放用户控件到窗体中运行,看看能否正常工作。

然后,在你想要添加下拉式计算器的项目中,创建另一个只有一个小按钮的用户控件。这个按钮将被用于打开计算器。

添加CalculatorControl内置引用文件到项目中。

创建一个新的继承ToolStripDropDown的类:

  1. using System.Windows.Forms;
  2. class CalDrop : ToolStripDropDown
  3. {
  4. Control content;
  5. ToolStripControlHost drop;
  6. public CalDrop(CalculatorControl content)
  7. {
  8. this.content = content;
  9. this.drop= new System.Windows.Forms.ToolStripControlHost(content);
  10. //Add the host to the list
  11. this.Items.Add(this.drop);
  12. }
  13. }

在按钮的单击事件中添加以下代码:

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. CalculatorControl calculator = new CalculatorControl();
  4. CalDrop cal = new CalDrop(calculator);
  5. Point controlLoc = fm.PointToScreen(button1.Location);
  6. Point relativeLoc = new Point(controlLoc.X + button1.Width + 100,
  7. controlLoc.Y + button1.Height * 2);
  8. Rectangle calRect = button1.DisplayRectangle;
  9. cal.Show(locPoint);
  10. }

添加控件到DataGridViewCell

在你构建解决方案时,新的按钮控件会出现在工具箱中。添加以下代码到项目的窗体类中。

  1. private CalculatorPick calculator;
  2. public form1()
  3. {
  4. calculator = new CalculatorPick();
  5. calculator.Visible = false;
  6. dataGridView2.Controls.Add(calculator);
  7. }
  8. private void dataGridView2_CellClick(object sender, DataGridViewCellEventArgs e)
  9. {
  10. if (e.ColumnIndex == clmCommision.Index)
  11. {
  12. Rectangle calRect = dataGridView2.GetCellDisplayRectangle
  13. (e.ColumnIndex, e.RowIndex,false);
  14. Point p = calculator.FindForm().PointToClient
  15. (calculator.Parent.PointToScreen(calculator.Location));
  16. p.X -= calculator.Width/3;
  17. p.Y += calculator.Height;
  18. calculator.LocPoint = p;
  19. calculator.Width = calRect.Width/3;
  20. calculator.Height = calRect.Height;
  21. calculator.Visible = true;
  22. calculator.Calculator.btnEqual.Click += new EventHandler(calculatorBtnEqlClicked);
  23. }
  24. else
  25. if(calculator!=null)
  26. calculator.Visible = false;
  27. }
  28. void calculatorBtnEqlClicked(object sender, EventArgs e)
  29. {
  30. dataGridView2.CurrentCell.Value = calculator.Calculator.Result.ToString();
  31. }

兴趣点

本技巧描述的是添加控件到DataGridView中,可以让界面显得更为互动。

许可证

这篇文章中任何相关的源代码和文件,都是在The Code Project Open License (CPOL)许可下的。

时间: 2024-12-14 18:06:26

C#实现日历样式的下拉式计算器的相关文章

Web前端开发实战3:二级下拉式菜单之jQuery实现

大家都知道jQuery是一个框架,它对JS进行了封装,使其更方便使用.前面两篇博文分别是用CSS样式和JS实现 的,那么这篇就用jQuery来实现二级下拉式菜单. 使用JQuery实现需要用到的知识有: 1)使用$(function(){...})获取到想要作用的HTML元素. 2)通过使用children()方法寻找子元素. 3)通过使用show()方法来显示HTML元素. 4)通过使用hide()方法来隐藏HTML元素. 5)jQuery库引用方法: 第一种方法:将jQuery库下载到电脑上

Web前端开发实战2:二级下拉式菜单之JS实现

上一篇博文提到了二级下拉式菜单是用HTML和CSS实现的,我们这一篇来用JavaScript脚本实现下拉菜单的显 示和隐藏.使用 JavaScript方法实现我们需要用的知识有: 1)JS事件:onmouseover鼠标经过事件和onmouseout鼠标离开事件. 2)JS基础语法:使用function关键字定义函数. 3)DOM编程:getElementsByTagName()方法. 那么接下来就是我们制作的流程: 1)隐藏二级菜单:设置CSS样式,让二级菜单隐藏. 2)编写显示子菜单show

PropertyGrid—为复杂属性提供下拉式编辑框和弹出式编辑框

零.引言 PropertyGrid中我们经常看到一些下拉式的编辑方式(Color属性)和弹出式编辑框(字体),这些都是为一些复杂的属性提供的编辑方式,本文主要说明如何实现这样的编辑方式. 一.为属性提供编辑类 弹出式和下拉式是如何实现的呢,这需要为属性提供一个专门的编辑类..Net为我们提供了一个System.Drawing.Design.UITypeEditor类,它是所有编辑类的基类,从他继承出了诸如ColorEditor.FontEditor的类,因此我们可以在属性框中编辑颜色和字体.定义

CSS样式三级下拉菜单

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="

令人眼前一亮的下拉式终端 Tilda & Guake

前言 老夫是 Linux 的~~老~~用户. 大一的时候某不方便透露姓名的校内组织给了一个 Fedora 13 的安装光盘,然后老夫学会了重装 Windows . 大二的时候知道了 Ubuntu ,开始在虚拟机和双系统中来回切换. 大三的时候硬盘安装了 CentOS ,开始正式成为 Linux 的用户. 大四的时候被 Debian 俘获. 毕业后的第一年在老板的威逼利诱之下,重新使用 Ubuntu . 现在老夫是 Debian 的忠实用户. 老夫一直在强调是 Linux 的用户,那是因为真的只是

QPushButton下拉式菜单(是否取消下拉三角,是否check)

给QPushButton添加菜单的示例,前面已经有了三种方式: Qt学习之给QPushButton添加菜单ActionsContextMenu方法 Qt学习之给QPushButton添加菜单CustomContextMenu方法 Qt学习之给QPushButton添加菜单DefaultContextMenu方法 今天再提供一种方式,就是给QPushButton添加下拉式菜单.类似于Combobox一样.前面三种方式实现的都是光标在哪个位置,菜单就在哪里显示.而下拉式菜单只在按钮的下方显示,同时会

Web前端开发实战6:CSS实现导航菜单结合二级下拉式菜单的简单变换

前面几篇博文都在讲导航菜单和二级下拉式菜单,其实有很多方法都可以实现的,具体的情况还要视情况而定. 在后面学习到jQuery框架之后,会有更丰富的动画效果,由于在学习Ajax和jQuery的初步阶段,对于很多的复杂的导 航菜单和二级下拉式菜单没法做,但是学习了CSS和JS还是能实现一些简单的变换的.这篇博文就来说说用CSS实现 导航菜单结合二级下拉式菜单的两个简单变换吧. 首先还是在前面博文的基础上加以实现,其实只用HTML和CSS还是可以做出不错的效果,但是相较于JS和 jQuery来说就有很

为下拉式菜单(DropDownList)添加第一个选项

很多方法可以为为下拉式菜单(DropDownList)添加第一个选项,下面是Insus.NET小结了几个方法,仅供参考: Html code: <body>    <form id="form1" runat="server">    <div>        <asp:DropDownList ID="DropDownList1" runat="server">        

(转载)一个用于Gnome桌面的下拉式终端: Guake 0.7.0 发布

转自:https://linux.cn/article-5507-1.html Linux的命令行是最好.最强大的东西,它使新手着迷,并为老手和极客的提供极其强大的功能.那些在服务器和生产环境下工作的人早已认识到了这个事实.有趣的是,Linux终端是Linus Torvald在1991年写内核时实现的第一批功能之一. 终端是个强大的工具,由于它没有什么可调整的部分,所以十分可靠.终端介于控制台环境和GUI环境之间.终端自身作为一个GUI程序,运行在桌面环 境下.有许多终端是适用于特定的桌面环境的