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,如有发现希望能留言给我。
如需本软件完整源码请留言!仅限学习交流使用!
