最近参加了Web基础开发的培训,收获不少,做了一个练习,在后台动态创建控件制作了一个简单功能的计算器。程序中控件创建好以后,往往不能放在想要的位置,前台的布局非常麻烦,我用Table、TableRow、TableCell对象来帮助前台页面的布局。在创建控件前,将要创建的控件分类,按照分类,用重载的方法自己定义了CreateBtn函数。然后用循环调用的方法进行创建。整个程序的代码如下:
前台HTML代码(VS2005自动生成的,我没做任何修改);

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>网页动态生成计算器</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    </form>
</body>
</html>

后台Asp.net代码:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page 
{
    //定义两个操作数
    static double Num1;
    static double Num2;
    //记录操作符
    static string OperatorF;
    //判断“=”是否被点击过,每次操作时清空上次操作的记录
    static bool ReOperator = false;
    TextBox txtShow = new TextBox();
   
    /**//// <summary>
    /// 在页面登录事件里面创建计算器的界面
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
 
    protected void Page_Load(object sender, EventArgs e)
    {
        //定义表格用于容纳其它创建的控件
        Table txtTB = new Table();
        form1.Controls.Add(txtTB);
        txtShow.Width = 110;
        TableRow TR = new TableRow();
        TableCell TC = new TableCell();
        TC.Controls.Add(txtShow);
        TR.Controls.Add(TC);
        txtTB.Controls.Add(TR);
        Table TB = new Table();
        form1.Controls.Add(TB);
        //循环创建有规律分布的数字控件,和操作符控件
        for (int i = 0,I = 1; i < 3; i++)
        {
            //用两个数组记录操作符控件的Text和ID值
            string[] Op = {"+","-","*"};
            string[] CharOp = {"jia","jian","cheng"};
            TableRow TRows = new TableRow();
            TB.Controls.Add(TRows);
            for (int j = 0; j < 3; j++)
            {
                TableCell Tcell = new TableCell(); 
                Tcell.Controls.Add(CreateBtn(I.ToString()));
                I++;
                TRows.Controls.Add(Tcell);
            }
            TableCell TcellO = new TableCell();
            Button OperBtn = new Button();
            OperBtn.Text = Op[i];
            OperBtn.ID = CharOp[i];
            OperBtn.Width = 25;
            OperBtn.Click += new EventHandler(Btn_Click);
            TcellO.Controls.Add(OperBtn);
            TRows.Controls.Add(TcellO);
        }

        TableRow TRow = new TableRow();
        TB.Controls.Add(TRow);
        TableCell Tc2 = new TableCell();
        Tc2.Controls.Add(CreateBtn("Backspace","B"));
        TRow.Controls.Add(Tc2);

        TableCell Tc3 = new TableCell();
        Tc3.Controls.Add(CreateBtn("Clear","C"));
        TRow.Controls.Add(Tc3);

        TableCell Tc1 = new TableCell();
        Tc1.Controls.Add(CreateBtn("deng", "="));
        TRow.Controls.Add(Tc1);

        TableCell Tc = new TableCell();
        Tc.Controls.Add(CreateBtn("chu", "/"));
        TRow.Controls.Add(Tc);
    }

    /**//// <summary>
    /// 创建操作数按钮的函数
    /// </summary>
    /// <param name="Num">操作数</param>
    /// <returns>返回一个按钮</returns>
    protected Button CreateBtn(string Num)
    {
        Button NumBtn = new Button();
        NumBtn.Text = Num;
        NumBtn.ID = "ID" + Num;
        NumBtn.Width = 25;
        NumBtn.Click += new EventHandler(Btn_Click);
        return NumBtn;
    }

    /**//// <summary>
    /// 创建操作符按钮的函数
    /// </summary>
    /// <param name="ID">按钮的ID号</param>
    /// <param name="Operator">操作符</param>
    /// <returns>返回一个按钮</returns>
    private Button CreateBtn(string ID, string Operator)
    {
        Button OperBtn = new Button();
        OperBtn.Text = Operator;
        OperBtn.ID = ID;
        OperBtn.Width = 25;
        OperBtn.Click += new EventHandler(Btn_Click);
        return OperBtn;
    }

    /**//// <summary>
    /// 定义按钮响应的事件,所有按钮通用一个事件,用按钮的Text属性区分要执行的操作
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Btn_Click(object sender, EventArgs e)
    {
        string BtnText = ((Button)sender).Text;
        switch(BtnText)
        {
            case "+":
                Num1 = int.Parse(txtShow.Text);
                OperatorF = BtnText;
                txtShow.Text = "";
                break;
            case "-":
                Num1 = int.Parse(txtShow.Text);
                OperatorF = BtnText;
                txtShow.Text = "";
                break;
            case "*":
                Num1 = int.Parse(txtShow.Text);
                OperatorF = BtnText;
                txtShow.Text = "";
                break;
            case "/":
                Num1 = int.Parse(txtShow.Text);
                OperatorF = BtnText;
                txtShow.Text = "";
                break;
            case "=":
                if (OperatorF == "+")
                {
                    Num2 = Num1 + double.Parse(txtShow.Text);
                    txtShow.Text = Num2.ToString();
                }
                else if (OperatorF == "-")
                {
                    Num2 = Num1 - double.Parse(txtShow.Text);
                    txtShow.Text = Num2.ToString();
                }
                else if (OperatorF == "*")
                {
                    Num2 = Num1 * double.Parse(txtShow.Text);
                    txtShow.Text = Num2.ToString();
                }
                else if (OperatorF == "/")
                {
                    Num2 = Num1 / double.Parse(txtShow.Text);
                    txtShow.Text = Num2.ToString();
                }
                ReOperator = true;
                break;
            case "C":
                txtShow.Text = "";
                Num1 = Num2 = 0;
                break;
            case "B":
                if (txtShow.Text.Length >=1)
                {
                    txtShow.Text = txtShow.Text.Substring(0, txtShow.Text.Length - 1);
                    if (txtShow.Text != "")
                        Num1 = int.Parse(txtShow.Text);
                    else
                        Num1 = 0;
                }
                break;
            default:
                if (ReOperator)
                {
                    txtShow.Text = "";
                    Num1 = Num2 = 0;
                    ReOperator = false;
                }
                txtShow.Text += BtnText;
                break;
        }
    } 
}

整个程序的运行结果如下:
                        

可以将这个计算器做成一个自定义Web控件,代码的改动不大,以后有机会了再讲,程序中做的计算器的功能还不完整,有的地方控制还不够,广大网友有兴趣还可以自己完善扩展。

转载于:https://www.cnblogs.com/salonliudong/archive/2007/05/19/752322.html

[原]动态创建Web控件制做计算器相关推荐

  1. asp.net 动态创建TextBox控件 如何加载状态信息

    接着上文Asp.net TextBox的TextChanged事件你真的清楚吗? 这里我们来说说状态数据时如何加载的. 虽然在Control中有调用状态转存的方法,但是这里有一个判断条件 if (_c ...

  2. FindChildControl与FindComponent(动态创建的控件要通过Owner.FindComponent去找该控件)

    前两天编码遇到了要使用FindChildControl方法获取指定名称的TSpeedButton按钮,结果折腾了半天就是没得结果(基础不扎实,呵呵),于是赶紧搜索了下,补习关于这两个方法的用法. TW ...

  3. 【VS开发】动态创建ActiveX控件

    bool CCollectDataDlgDlg::CreateMyCtrl(LPRECT lpRect, UINT nID, CWnd *pParent) {  CLSID clsid;  wstri ...

  4. js动态创建html控件,通过JS动态添加html控件后,添加样式以及OnClick

    /** * 新增标签 * @param count */ function addLabel(count){ var image_id_obj = document.getElementById(&q ...

  5. [转]利用ASP.NET 2.0创建自定义Web控件(1)

    原址:http://hi.baidu.com/sjbh/blog/item/cc58fd1bd35d3ad2ad6e7593.html   简介 从使用基本的文本编辑器到创作标记页面,Web 开发已经 ...

  6. asp.net panel 加html,ASP.NET 页面中动态增加的控件、添加事件

    要求:页面上有一个Add按钮,每点击一次该按钮,页面上动态创建一个WebPartZone! 提醒:WebPartZone只能在OnInit或之前才能创建,否则报异常! 大家都知道,按钮的点击事件是在R ...

  7. 动态创建 Web 服务器控件模板

    由于各种原因,直到运行时,您可能才会知道需要什么模板或模板中应包含哪些文本或控件.在这种情况下,您需要能够动态创建该模板(在代码中). 注意   您还可以将模板创建为 Web 窗体用户控件,并将其动态 ...

  8. Web控件文本框Reset的功能

    在前一篇中<怎样实现Web控件文本框Reset的功能>http://www.cnblogs.com/insus/p/4120889.html Insus.NET只实现了文本框的功能.单个或 ...

  9. Html控件和Web控件(转)

    作为一名ASP.NET的初学者,了解并且区别一些混淆概念是很必须的,今天这篇博文 就是主要向大家介绍一下Html控件和Web控件.在ASP.net中,用户界面控件主要就是 Html控件和Web控件,在 ...

最新文章

  1. 求解迷宫问题的所有路径及最短路径程序
  2. windows下,怎么轻易拷贝一个文件的完整路径?
  3. 六部工坊ros启智机器人定点导航技术_【展品抢鲜看】程天科技外骨骼机器人亮相峰会,让每个人享受机器人的服务!...
  4. 游戏开发中一些常用的数学知识
  5. 同人游戏开发工具巡礼——AVG(ADV)引擎篇
  6. 矩阵连乘问题算法思想_算法分析与设计——矩阵连乘问题
  7. vscode中出现 Statements must be separated by newlines or semicolons 问题的解决方法之一
  8. 个人博客logo如何设计?案例合集参考
  9. 模型包装,答辩吹牛方法论!
  10. Flutter开发之——getX-路由管理(04)
  11. Python-爬虫(爬虫练习 爬取古诗文网五言绝句)
  12. tableView的懒懒的跳转方式,加载数据源方式
  13. android仿抖音礼物列表实现,Android仿抖音列表效果
  14. 自注意力机制与注意力机制
  15. Google Android 开发者网站更新了
  16. PCB布局布线技巧总结
  17. 正则表达式30分钟入门
  18. HTML基础(P24-P44)
  19. 切绳子题解(博客搬家)
  20. 2019年秋季学期实验室安全考试2

热门文章

  1. 在cxf中使用配置避免增加字段导致客户端必须更新、同步实体属性的问题
  2. JavaScript核心语法学习部分(四)
  3. Unity3d5.0之后关于游戏音乐的管理
  4. 我也来搭android环境
  5. Java入门系列-16-继承
  6. 第一百一十四节,JavaScript文档对象,DOM进阶
  7. c primer plus(第五版)读书笔计 第四章(1)
  8. [转]免费邮件服务器hMailServer搭配SpamAssassin过滤垃圾邮件:安装和设置
  9. 设计模式总结——代理模式以及java的动态代理
  10. React源码分析与实现(一):组件的初始化与渲染