背景:想记录每日工作、学习时长。
需求:推荐一个【小时分钟秒加减计算器】软件或在线网页。具体如下:
看书A:00:38:50.
笔记B:01:10:26
视频C:03:19:38
计算结果:今日总学习时长:05:08:54
【需要支持自定义个数的多个时长计算,我查了一下在线的,基本都是只支持2个时长计算,每次都得A+B=X,X+C=Y,Y+D=Z。。。很麻烦,而不能直接A+B+C+D=???一次性多个时间计算(最好也支持减法)】 。
初始化
public Form1()
{
InitializeComponent();
myButton = new Button();
myButton.Text = "加一列";
myButton.Location = new System.Drawing.Point(50, 50);
myButton.Click += new EventHandler(MyButton_Click);
this.Controls.Add(myButton);
hourLabel = new Label()
{
Text = "时",
Location = new Point(50, 100)
};
this.Controls.Add(hourLabel);
minuteLabel = new Label()
{
Text = "分",
Location = new Point(200, 100)
};
this.Controls.Add(minuteLabel);
secondLabel = new Label()
{
Text = "秒",
Location = new Point(350, 100)
};
this.Controls.Add(secondLabel);
}
private Label hourLabel;
private Label minuteLabel;
private Label secondLabel;
private Button myButton;
private TextBox hourTextBox;
private TextBox minuteTextBox;
private TextBox secondTextBox;
private ComboBox comboBox;
private Label jiedian;
//计算位置
private int controlCounter = 0;
private int jisuanNum = 0;
int num = 0;
添加计算 时分秒、加减号下拉框 事件
private void MyButton_Click(object sender, EventArgs e)
{
controlCounter++;
hourTextBox = new TextBox();
hourTextBox.Name = "hourTextBox" + num;
hourTextBox.Location = new System.Drawing.Point(50, 100 + controlCounter * 60); // 调整位置以避免重叠
hourTextBox.Size = new System.Drawing.Size(100, 20);
this.Controls.Add(hourTextBox);
minuteTextBox = new TextBox();
minuteTextBox.Name = "minuteTextBox" + num;
minuteTextBox.Location = new System.Drawing.Point(200, 100 + controlCounter * 60); // 调整位置以避免重叠
minuteTextBox.Size = new System.Drawing.Size(100, 20);
this.Controls.Add(minuteTextBox);
secondTextBox = new TextBox();
secondTextBox.Name = "secondTextBox" + num;
secondTextBox.Location = new System.Drawing.Point(350, 100 + controlCounter * 60); // 调整位置以避免重叠
secondTextBox.Size = new System.Drawing.Size(100, 20);
this.Controls.Add(secondTextBox);
if (num != 0 && num != jisuanNum)
{
comboBox = new ComboBox();
comboBox.Name = "comboBox" + num;
comboBox.Location = new System.Drawing.Point(200, 70 + controlCounter * 60); // 调整位置以避免重叠
comboBox.Items.Add("+");
comboBox.Items.Add("-");
this.Controls.Add(comboBox);
}
num += 1;
}
计算事件
/// <summary>
/// 计算
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
int miao = 0;
int fen = 0;
int xiaoshi = 0;
for (int i = jisuanNum; i < num; i++)
{
if (i == jisuanNum)
{
xiaoshi = Convert.ToInt32((this.Controls.Find("hourTextBox" + i, true).FirstOrDefault() as TextBox).Text);
fen = Convert.ToInt32((this.Controls.Find("minuteTextBox" + i, true).FirstOrDefault() as TextBox).Text);
miao = Convert.ToInt32((this.Controls.Find("secondTextBox" + i, true).FirstOrDefault() as TextBox).Text);
}
else
{
var type = (this.Controls.Find("comboBox" + i, true).FirstOrDefault() as ComboBox).SelectedItem.ToString();
var _xiaoshi = Convert.ToInt32((this.Controls.Find("hourTextBox" + i, true).FirstOrDefault() as TextBox).Text);
var _fen = Convert.ToInt32((this.Controls.Find("minuteTextBox" + i, true).FirstOrDefault() as TextBox).Text);
var _miao = Convert.ToInt32((this.Controls.Find("secondTextBox" + i, true).FirstOrDefault() as TextBox).Text);
xiaoshi = type == "+" ? xiaoshi + _xiaoshi : xiaoshi - _xiaoshi;
fen = type == "+" ? fen + _fen : fen - _fen;
miao = type == "+" ? miao + _miao : miao - _miao;
}
}
// 计算总秒数
int totalSeconds = xiaoshi * 3600 + fen * 60 + miao;
// 计算进位的小时、分钟和秒
int carryHours = (totalSeconds / 3600); // 整除得到小时数,模24得到进位的小时数
int carryMinutes = (totalSeconds / 60) % 60; // 整除得到分钟数,模60得到进位的分钟数
int carrySeconds = totalSeconds % 60; // 得到剩余的秒数
controlCounter++;
hourTextBox = new TextBox();
hourTextBox.Name = "hourTextBoxjieguo";
hourTextBox.Location = new System.Drawing.Point(50, 80 + controlCounter * 60); // 调整位置以避免重叠
hourTextBox.Size = new System.Drawing.Size(100, 20);
hourTextBox.Text = carryHours.ToString();
this.Controls.Add(hourTextBox);
minuteTextBox = new TextBox();
minuteTextBox.Name = "minuteTextBoxjieguo";
minuteTextBox.Location = new System.Drawing.Point(200, 80 + controlCounter * 60); // 调整位置以避免重叠
minuteTextBox.Size = new System.Drawing.Size(100, 20);
minuteTextBox.Text = carryMinutes.ToString();
this.Controls.Add(minuteTextBox);
secondTextBox = new TextBox();
secondTextBox.Name = "secondTextBoxjieguo";
secondTextBox.Location = new System.Drawing.Point(350, 80 + controlCounter * 60); // 调整位置以避免重叠
secondTextBox.Size = new System.Drawing.Size(100, 20);
secondTextBox.Text = carrySeconds.ToString();
this.Controls.Add(secondTextBox);
jiedian = new Label()
{
Text = "---------------------------------------------------",
Location = new Point(50, 110 + controlCounter * 60),
Size = new Size(200,20),
};
this.Controls.Add(jiedian);
//计算后计数,下次计算从这个开始
jisuanNum = num;
}
重置事件
/// <summary>
/// 重置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
for (int i = this.Controls.Count - 1; i >= 0; i--)
{
if (this.Controls[i] is ComboBox)
{
this.Controls.RemoveAt(i);
}
}
for (int i = this.Controls.Count - 1; i >= 0; i--)
{
if (this.Controls[i] is TextBox)
{
this.Controls.RemoveAt(i);
}
}
for (int i = this.Controls.Count - 1; i >= 0; i--)
{
if (this.Controls[i] is Label)
{
this.Controls.RemoveAt(i);
}
}
//重置后清零
controlCounter = 0;
num = 0;
jisuanNum = 0;
}