C# 费用计算器(源码) 可计算项目材料数量,材料所需费用,所有材料总价,其他费用,利润金额等...
制作本软件初衷:做本软件开始主要是为了计算 施工 项目资金减去所需的材料成本和人工成本是否有利润。
软件部分使用动态创建控件。GroupBox控件限制在最多创建9个。
PS:另一种方法可以先将界面调整完成,在通过使用GroupBox控件的 Visible 属性 隐藏控件。添加新材料 可以将控件显示。(具体没测试。)
主界面:
总平方数:这里输入施工总平方数,后期用于计算 材料所需数量。
预支付金:这里可以输入 开发商支付 金额,后期用于减去成本总金额,得出利润值。
新建计算 按钮:新建一个新的项目计算器。
读取数据 按钮:用于读取以前保存的数据。
计算器界面:
总平方数:显示主界面 总平方数 数据,无法修改。
预支付金:显示主界面 预支付金 数据,无法修改。
总需金额:显示所有材料和其他费用的总和,无法修改。
其他费用:显示其他所需费用,用户输入。
费用说明:显示其他费用信息说明,用户输入。
利润金额:显示预支付金减去总需金额的值,无法修改。
需要材料-GroupBox 控件
材料名称:显示材料名称,用户输入。
单捆平方:显示单个产品可以使用多少平方,用户必须输入。
需要数量:显示 总平方/单捆平方 无法修改。
材料单价:显示产品单价,用户必须输入。
材料总价:显示 需要数量*产品单价 ,无法修改。
其他说明:显示材料其他说明,用户输入。
计算金额 按钮:用于计算 材料总价,总需金额,利润金额。
添加材料 按钮:用于添加新的材料。
保存数据 按钮:用于保存数据,以备下次读取使用。
返回首页 按钮:用于返回主界面。
以下为部分代码:
动态创建GroupBox代码:
void CreateGBox(string text)//创建 GroupBox 控件 { #region 创建 GroupBox 控件 GroupBox Gbox = new GroupBox();//实例化 Gbox.Name = "GBox" + GBoxN;//命名 比如:GBox0、GBox1、GBox2..... 后面需要此名字 获取 实例控件 Gbox.Text = text + "-" + (GBoxN + 1);//标题 Gbox.Width = 200;//宽度 Gbox.Height = 200;//高度 if (GBoxN < 3)//判断 GroupBox 控件 数量 { int row = GBoxN / 3; Gbox.Left = GBoxN * 200 + 10;//设置 表示控件左边缘与其容器的工作区左边缘之间的距离(以像素为单位) Gbox.Top = row * 200 + 120; //设置 表示控件下边缘与其容器的工作区上边缘之间的距离(以像素为单位)。 } else if (GBoxN < 6) { int list = GBoxN - 3; int row = GBoxN / 3; Gbox.Left = list * 200 + 10; Gbox.Top = row * 200 + 120; this.Width = 635; this.Height = 570; } else if (GBoxN < 9) { int list = GBoxN - 6; int row = GBoxN / 3; Gbox.Left = list * 200 + 10; Gbox.Top = row * 200 + 120; this.Width = 635; this.Height = 770; } else { MessageBox.Show("最多只能创建9个材料.", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);//提示 return;//返回 } Controls.Add(Gbox);//将 GroupBox 控件 添加到窗体上 #endregion CreateControls(Gbox);//调用 创建控件(标签和文本框) 方法 GBoxN++;//每创建一个 GroupBox 控件 自增1 }
动态创建 标签 和 文本框:
void CreateControls(GroupBox gBox)//创建 标签和文本框 { for (int i = 0; i < 6; i++) { #region 创建标签 Label LB = new Label();//实例化 LB.Name = "LB" + GBoxN + i;//命名 switch (i)//判断 { case 0: LB.Text = "材料名称:"; break; case 1: LB.Text = "单捆平方:"; break; case 2: LB.Text = "需要数量:"; break; case 3: LB.Text = "材料单价:"; break; case 4: LB.Text = "材料总价:"; break; case 5: LB.Text = "其他说明:"; break; } LB.Width = 70;//宽 LB.Height = 12;//高 LB.Left = 20; LB.Top = i * 30 + 20; gBox.Controls.Add(LB);//添加到 GroupBox 控件 #endregion #region 创建文本框 TextBox Txt = new TextBox();//实例化 Txt.Name = "T" + GBoxN + i;//命名 比如 T00、T01、T10、T21...(T后面第一个数可以判断是哪个GroupBox 控件,第二个数判断是第几个文本框) 后面需要 获取实例控件 Txt.Width = 100;//宽 Txt.Height = 12;//高 Txt.Left = 90; Txt.Top = i * 30 + 16; if (i == 0) { Txt.Text = "材料" + (GBoxN + 1); } if (i == 2 || i == 4) { Txt.ReadOnly = true; } if (i == 1 || i == 3) { Txt.BackColor = Color.Gold; } gBox.Controls.Add(Txt);//添加到 GroupBox 控件 #endregion } }
保存数据代码:
void Save()//整理数据 { string data = "本文件为=费用计算器数据保存文件,请勿修改.\r\n";//声明一个字符串变量 用于最后写入文本文档 data += "GBoxN=" + (GBoxN - 1) + "\r\n";// GBoxN 数据. data += "总平方数=" + txtSum.Text + "\r\n"; //总平方数据 data += "预支付金=" + txtPay.Text + "\r\n";//预支付金 data += "其他费用=" + txtOther.Text + "\r\n";//其他费用 data += "费用说明=" + txtExplain.Text + "\r\n";//费用说明 for (int i = 0; i <= (GBoxN - 1); i++) { GroupBox GB = (GroupBox)Controls["GBox" + i]; TextBox TxtB0 = (TextBox)GB.Controls["T" + i + "0"]; TextBox TxtB1 = (TextBox)GB.Controls["T" + i + "1"]; TextBox TxtB3 = (TextBox)GB.Controls["T" + i + "3"]; TextBox TxtB5 = (TextBox)GB.Controls["T" + i + "5"]; data += "[" + GB.Text + "=数据]\r\n"; data += "材料名称" + i + "=" + TxtB0.Text + "\r\n";//材料名称 data += "单捆平方" + i + "=" + TxtB1.Text + "\r\n";//单捆平方 data += "材料单价" + i + "=" + TxtB3.Text + "\r\n";//材料单价 data += "其他说明" + i + "=" + TxtB5.Text + "\r\n";//其他说明 } CreateSave(data);//调用方法 } void CreateSave(string data)//将数据写入文本文档 { using (SaveFileDialog SF = new SaveFileDialog())//实例化 { SF.Title = "保存数据"; SF.Filter = "文本文档(*.txt)|*.txt"; SF.DefaultExt = "txt"; SF.AddExtension = true; SF.InitialDirectory = Application.StartupPath;//保存地址默认打开为当前软件所在目录 SF.RestoreDirectory = true; SF.FileName = "数据保存"+DateTime.Now.ToString("yyyyMMddHHmmss"); if (SF.ShowDialog() != DialogResult.OK) { MessageBox.Show("请确定数据保存位置和文件.", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } using (StreamWriter sw = new StreamWriter(SF.FileName)) { sw.Write(data);//将 字符串内容 写入文本文档 } } MessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); }
读取数据代码:
void OpenData()//读取文本文档 { using (FileStream FS = File.OpenRead(path))//实例化 { using (StreamReader sr = new StreamReader(FS)) { int GBoxNum = -1;//声明变量 int countline = 0;//用于统计错误行号 int errorcount = 0;//用于统计最后错误数量 string line = null;//声明变量 while ((line = sr.ReadLine()) != null)//判断读取的行是否为空。 { countline++; string[] str = line.Split(new char[] { '=' });//按=进行分割,存入 数组中 if (str.Length < 2)//判断数组大小是否小于2 { errorcount++; if (MessageBox.Show("第 [" + countline + "] 行的 [" + str[0] + "] 部分数据已损坏,未加载成功.\r\n是否跳过本条数据继续加载?", "数据错误", MessageBoxButtons.YesNo, MessageBoxIcon.Error) == DialogResult.No)//判断是否单击了 提示框的 No 按钮 { System.Environment.Exit(0);//强制关闭所有窗体 } continue;//结束本次循环 } #region 用于判断输出基本信息 switch (str[0])//判断读取数据的 第一个元素的值 { case "GBoxN": GBoxNum = Convert.ToInt32(str[1]);//转换成整型 if (GBoxNum > 9 || GBoxNum < 0)//判断数量大小 { MessageBox.Show("数据错误,已无法使用.", "数据错误", MessageBoxButtons.OK, MessageBoxIcon.Error);//提示 return; } for (int i = 0; i <= GBoxNum; i++)//根据 GBoxNum 值 创建GroupBox 控件 { CreateGBox("需要材料"); } break; case "总平方数": txtSum.Text = str[1];//总平方数 break; case "预支付金": txtPay.Text = str[1];//预支付金 break; case "其他费用": txtOther.Text = str[1];//其他费用 break; case "费用说明": txtExplain.Text = str[1];//费用说明 break; } #endregion #region 用于循环输出 GroupBox 控件上的 文本框的值 for (int i = 0; i <= GBoxNum; i++)//循环 { GroupBox GB = (GroupBox)Controls["GBox" + i]; TextBox TxtB0 = (TextBox)GB.Controls["T" + i + "0"]; TextBox TxtB1 = (TextBox)GB.Controls["T" + i + "1"]; TextBox TxtB3 = (TextBox)GB.Controls["T" + i + "3"]; TextBox TxtB5 = (TextBox)GB.Controls["T" + i + "5"]; if (str[0] == ("材料名称" + i)) { TxtB0.Text = str[1];//材料名称 } else if (str[0] == ("单捆平方" + i)) { TxtB1.Text = str[1];//单捆平方 } else if (str[0] == ("材料单价" + i)) { TxtB3.Text = str[1];//材料单价 } else if (str[0] == ("其他说明" + i)) { TxtB5.Text = str[1];//其他说明 } } #endregion } if (errorcount == 0) { MessageBox.Show("数据已加载完成.", "完成加载", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("数据已加载.其中有 " + errorcount +" 行错误.", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } }
软件截图:
在使用中可能会有未知BUG,如有发现希望能留言给我。
如需本软件完整源码请留言!仅限学习交流使用!