C#日历样式的下拉式计算器实例讲解

时间:2021-12-01 07:59:17

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

介绍

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

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

C#日历样式的下拉式计算器实例讲解

C#日历样式的下拉式计算器实例讲解

使用代码

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

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

C#日历样式的下拉式计算器实例讲解

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//
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的类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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);
    }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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中,可以让界面显得更为互动,喜欢的朋友就点个赞吧!