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

简介:

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

介绍

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

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

Before Opening the Drop

Drop View

使用代码

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

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

Calculator Design

为了快速搞定计算器功能,可以点击这里下载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.  
  9. public void btnEqual_Click(object sender, EventArgs e) 
  10.         { 
  11.             Expression ex = new Expression(textBox1.Text); 
  12.             if (ex.HasErrors()) 
  13.             { 
  14.                 //Invalid Expression 
  15.             } 
  16.             else 
  17.             { 
  18.                 result = Convert.ToDouble(ex.Evaluate()); 
  19.                 resText = result.ToString(); 
  20.             } 
  21.             textBox1.Text = resText; 
  22.             text = resText; 
  23.             eqPressed = true
  24.  
  25.         } 
  26. // 

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

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

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

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

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

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

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

添加控件到DataGridViewCell

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

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

兴趣点

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



作者:小峰

来源:51CTO

相关文章
|
6月前
jeDate日期控件在项目中实际应用
jeDate日期控件在项目中实际应用
25 0
|
4月前
|
小程序
微信小程序日期下拉框规定显示年,月
微信小程序日期下拉框规定显示年,月
|
5月前
|
JavaScript 前端开发 容器
js使用表格生成一个日历,点击按钮上查看上个月,点击按钮下,查看下个月,月份,年份
js使用表格生成一个日历,点击按钮上查看上个月,点击按钮下,查看下个月,月份,年份
62 0
|
6月前
lunar="false",日历插件不显示农历
lunar="false",日历插件不显示农历
33 1
|
6月前
|
前端开发 JavaScript
JavaScript日历制作并实现拖动选择日期
JavaScript日历制作并实现拖动选择日期
48 0
|
8月前
|
JavaScript Android开发
js日期控件 (补助计算器页面)
js日期控件 (补助计算器页面)
37 0
|
前端开发 JavaScript 容器
开源炫酷日历、网页日历模板、自适应大小日历、win10日历
开源炫酷日历、网页日历模板、自适应大小日历、win10日历
286 0
开源炫酷日历、网页日历模板、自适应大小日历、win10日历
从零开始学Pyqt5之【控件介绍】(16):日历与时间控件QCalendar、QDateTImeEdit
从零开始学Pyqt5之【控件介绍】(16):日历与时间控件QCalendar、QDateTImeEdit
从零开始学Pyqt5之【控件介绍】(16):日历与时间控件QCalendar、QDateTImeEdit
|
Windows
私人定制日历代码改进
2021年即将到来,小编学习了calendR这个包,并写了两篇推送。分别为: R可视乎|2021年日历大派送 calendR包—私人定制专属日历 并开源了自己的代码在github上,但是细心的读者发现代码还存在可以优化的地方。
133 0
私人定制日历代码改进
短视频程序,日期选择框前进后退
短视频程序,日期选择框前进后退
419 0