問題是您不能將它分配給只讀的時間跨度毫秒。
private void UpdateTime()
{
if (ticksDisplayed > 0)
btnReset.Enabled = true;
richTextBox1.Text = GetTimeString(watch.Elapsed);
optionsfile.SetKey("result", result.ToString());
}
private string GetTimeString(TimeSpan elapsed)
{
result = string.Empty;
diff = elapsed.Ticks - previousTicks;
if (radioButton1.Checked == true)
{
ticksDisplayed = diff;
}
else
{
if (countingDown)
{
ticksDisplayed = diff;
}
else
{
ticksDisplayed -= diff;
}
}
if (ticksDisplayed < 0)
{
ticksDisplayed = 0;
watch.Stop();
btnStart.Text = "START";
btnPause.Text = "PAUSE";
btnPause.Enabled = false;
if (trackBarHours.Value == 0 && trackBarMinutes.Value == 0 && trackBarSeconds.Value == 0 && ticksDisplayed == 0)
{
btnReset.Enabled = false;
}
timer1.Enabled = false;
}
ctimeSpan = new TimeSpan(ticksDisplayed);
timeTarget(ctimeSpan);
if (trackBarHours.Value != ctimeSpan.Hours) { trackBarHours.Value = ctimeSpan.Hours; }
if (trackBarMinutes.Value != ctimeSpan.Minutes) { trackBarMinutes.Value = ctimeSpan.Minutes; }
if (trackBarSeconds.Value != ctimeSpan.Seconds) { trackBarSeconds.Value = ctimeSpan.Seconds; }
result = string.Format("{0:00}:{1:00}:{2:00}.{3:000}",
ctimeSpan.Hours,
ctimeSpan.Minutes,
ctimeSpan.Seconds,
ctimeSpan.Milliseconds);
previousTicks = elapsed.Ticks;
return result;
}
在這里呼叫 UpdateTime
private void timer1_Tick(object sender, EventArgs e)
{
UpdateTime();
}
保存時間跨度毫秒不是問題,問題是如何讀回它,因為您不能分配給 ctimeSpan.Milliseconds。
我可以在更多地方再次保存 string.Format 變數結果,但如果我嘗試將其保存在 form1 關閉事件中,有時結果為空。所以我更喜歡在那種特定情況下只保存和加載 ctimeSpan.Milliseconds 值。
使用 form1 的完整代碼和螢屏截圖進行編輯。
現在我正在使用 3 個 trackBar 來保存和加載時間跨度小時、分鐘、秒,但是因為我不想為毫秒添加另一個 trackBar,這就是我想保存/加載毫秒分隔的原因。
在我的應用程式中,我使用自己的 OptionsFile 類,但我想找到邏輯以及如何保存/加載毫秒與我保存/加載小時、分鐘、秒的方式分開并不重要。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using DannyGeneral;
namespace StopwatchTimer
{
public partial class Form1 : Form
{
private static readonly Stopwatch watch = new Stopwatch();
private long diff = 0, previousTicks = 0, ticksDisplayed = 0;
private OptionsFile optionsfile = new OptionsFile(Path.GetDirectoryName(Application.LocalUserAppDataPath) "\\Settings.txt");
private string result;
private bool runOnStart = false;
private bool countingDown = false;
private TimeSpan ctimeSpan;
public Form1()
{
InitializeComponent();
richTextBox1.TabStop = false;
richTextBox1.ReadOnly = true;
richTextBox1.BackColor = Color.White;
richTextBox1.Cursor = Cursors.Arrow;
richTextBox1.Enter = RichTextBox1_Enter;
trackBarHours.Value = Convert.ToInt32(optionsfile.GetKey("trackbarhours"));
trackBarMinutes.Value = Convert.ToInt32(optionsfile.GetKey("trackbarminutes"));
trackBarSeconds.Value = Convert.ToInt32(optionsfile.GetKey("trackbarseconds"));
richTextBox1.Text = optionsfile.GetKey("result");
TimeSpan ctimeSpan = new TimeSpan(0, trackBarHours.Value, trackBarMinutes.Value, trackBarSeconds.Value, 0);
ticksDisplayed = ctimeSpan.Ticks;
radioButton1.Checked = GetBool("radiobutton1");
timeTargetchkbox.Checked = GetBool("timetargetcheckbox");
timeTargetchkboxState();
if (ticksDisplayed > 0 && radioButton1.Checked == false)
radioButton2.Checked = true;
if (ticksDisplayed == 0)
radioButton1.Checked = true;
if (trackBarHours.Value == 0 && trackBarMinutes.Value == 0 && trackBarSeconds.Value == 0)
{
btnPause.Enabled = false;
btnReset.Enabled = false;
}
else
{
btnPause.Enabled = false;
btnReset.Enabled = true;
}
runOnStart = GetBool("runonstart");
if (runOnStart == true)
{
autoRunOnStart.Checked = true;
StartOnRun();
}
else
{
autoRunOnStart.Checked = false;
}
}
private void timeTargetchkboxState()
{
if (timeTargetchkbox.Checked == false)
{
dateTimePicker1.Enabled = false;
}
else
{
dateTimePicker1.Enabled = true;
}
}
private void RichTextBox1_Enter(object sender, EventArgs e)
{
btnStart.Focus();
}
private void UpdateTime()
{
if (ticksDisplayed > 0)
btnReset.Enabled = true;
richTextBox1.Text = GetTimeString(watch.Elapsed);
optionsfile.SetKey("result", result.ToString());
}
private string GetTimeString(TimeSpan elapsed)
{
result = string.Empty;
diff = elapsed.Ticks - previousTicks;
if (radioButton1.Checked == true)
{
ticksDisplayed = diff;
}
else
{
if (countingDown)
{
ticksDisplayed = diff;
}
else
{
ticksDisplayed -= diff;
}
}
if (ticksDisplayed < 0)
{
ticksDisplayed = 0;
watch.Stop();
btnStart.Text = "START";
btnPause.Text = "PAUSE";
btnPause.Enabled = false;
if (trackBarHours.Value == 0 && trackBarMinutes.Value == 0 && trackBarSeconds.Value == 0 && ticksDisplayed == 0)
{
btnReset.Enabled = false;
}
timer1.Enabled = false;
}
ctimeSpan = new TimeSpan(ticksDisplayed);
timeTarget(ctimeSpan);
if (trackBarHours.Value != ctimeSpan.Hours) { trackBarHours.Value = ctimeSpan.Hours; }
if (trackBarMinutes.Value != ctimeSpan.Minutes) { trackBarMinutes.Value = ctimeSpan.Minutes; }
if (trackBarSeconds.Value != ctimeSpan.Seconds) { trackBarSeconds.Value = ctimeSpan.Seconds; }
result = string.Format("{0:00}:{1:00}:{2:00}.{3:000}",
ctimeSpan.Hours,
ctimeSpan.Minutes,
ctimeSpan.Seconds,
ctimeSpan.Milliseconds);
previousTicks = elapsed.Ticks;
return result;
}
private void timeTarget(TimeSpan ctimeSpan)
{
if (dateTimePicker1.Value.Hour == ctimeSpan.Hours
&& dateTimePicker1.Value.Minute == ctimeSpan.Minutes
&& dateTimePicker1.Value.Second == ctimeSpan.Seconds
&& timeTargetchkbox.Checked == true)
{
//ticksDisplayed = 0;
if (btnPause.Text == "PAUSE")
{
btnPause.Text = "CONTINUE";
watch.Stop();
timer1.Enabled = false;
}
}
else
{
if (btnStart.Text == "STOP")
{
btnPause.Text = "PAUSE";
watch.Start();
timer1.Enabled = true;
}
}
timeTargetchkboxState();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void btnStart_Click(object sender, EventArgs e)
{
if (btnStart.Text == "START")
{
watch.Reset();
TimeSpan ctimeSpan = new TimeSpan(0, trackBarHours.Value, trackBarMinutes.Value, trackBarSeconds.Value, 0);
diff = 0;
previousTicks = 0;
ticksDisplayed = ctimeSpan.Ticks;
watch.Start();
btnStart.Text = "STOP";
btnPause.Enabled = true;
btnReset.Enabled = true;
timer1.Enabled = true;
}
else
{
watch.Stop();
btnStart.Text = "START";
btnPause.Text = "PAUSE";
btnPause.Enabled = false;
btnReset.Enabled = false;
trackBarHours.Value = 0;
trackBarMinutes.Value = 0;
trackBarSeconds.Value = 0;
TimeSpan ctimeSpan = new TimeSpan(0, trackBarHours.Value, trackBarMinutes.Value, trackBarSeconds.Value, 0);
diff = 0;
previousTicks = 0;
ticksDisplayed = ctimeSpan.Ticks;
watch.Reset();
timer1.Enabled = false;
UpdateTime();
}
}
private void btnReset_Click(object sender, EventArgs e)
{
watch.Reset();
diff = 0;
previousTicks = 0;
ticksDisplayed = 0;
trackBarHours.Value = 0;
trackBarMinutes.Value = 0;
trackBarSeconds.Value = 0;
if (trackBarHours.Value == 0 && trackBarMinutes.Value == 0 && trackBarSeconds.Value == 0)
{
btnReset.Enabled = false;
}
else
{
btnReset.Enabled = true;
}
if (radioButton2.Checked && ticksDisplayed == 0)
{
countingDown = true;
radioButton2.Checked = false;
radioButton1.Checked = true;
}
UpdateTime();
}
private void trackBarHours_Scroll(object sender, EventArgs e)
{
TimeSpan ctimeSpan = new TimeSpan(ticksDisplayed);
TimeSpan htimeSpan = new TimeSpan(ctimeSpan.Days, trackBarHours.Value, ctimeSpan.Minutes, ctimeSpan.Seconds, ctimeSpan.Milliseconds);
ticksDisplayed = htimeSpan.Ticks;
TrackbarsScrollStates();
optionsfile.SetKey("trackbarhours", trackBarHours.Value.ToString());
UpdateTime();
}
private void trackBarMinutes_Scroll(object sender, EventArgs e)
{
TimeSpan ctimeSpan = new TimeSpan(ticksDisplayed);
TimeSpan mtimeSpan = new TimeSpan(ctimeSpan.Days, ctimeSpan.Hours, trackBarMinutes.Value, ctimeSpan.Seconds, ctimeSpan.Milliseconds);
ticksDisplayed = mtimeSpan.Ticks;
TrackbarsScrollStates();
optionsfile.SetKey("trackbarminutes", trackBarMinutes.Value.ToString());
UpdateTime();
}
private void trackBarSeconds_Scroll(object sender, EventArgs e)
{
TimeSpan ctimeSpan = new TimeSpan(ticksDisplayed);
TimeSpan stimeSpan = new TimeSpan(ctimeSpan.Days, ctimeSpan.Hours, ctimeSpan.Minutes, trackBarSeconds.Value, ctimeSpan.Milliseconds);
ticksDisplayed = stimeSpan.Ticks;
TrackbarsScrollStates();
optionsfile.SetKey("trackbarseconds", trackBarSeconds.Value.ToString());
UpdateTime();
}
private void TrackbarsScrollStates()
{
if (trackBarSeconds.Value == 0 && trackBarHours.Value == 0 && trackBarMinutes.Value == 0)
btnReset.Enabled = false;
if (trackBarSeconds.Value > 0 || trackBarHours.Value > 0 || trackBarMinutes.Value > 0)
btnReset.Enabled = true;
}
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
optionsfile.SetKey("radiobutton1", radioButton1.Checked.ToString());
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
optionsfile.SetKey("trackbarhours", trackBarHours.Value.ToString());
optionsfile.SetKey("trackbarminutes", trackBarMinutes.Value.ToString());
optionsfile.SetKey("trackbarseconds", trackBarSeconds.Value.ToString());
}
private void btnPause_Click(object sender, EventArgs e)
{
Pause();
}
private void Pause()
{
if (btnStart.Text == "STOP")
{
if (btnPause.Text == "PAUSE")
{
btnPause.Text = "CONTINUE";
watch.Stop();
timer1.Enabled = false;
}
else
{
btnPause.Text = "PAUSE";
watch.Start();
timer1.Enabled = true;
}
}
}
private void timer1_Tick(object sender, EventArgs e)
{
UpdateTime();
}
private void autoRunOnStart_CheckedChanged(object sender, EventArgs e)
{
if (autoRunOnStart.Checked)
{
runOnStart = true;
}
else
{
runOnStart = false;
}
optionsfile.SetKey("runonstart", runOnStart.ToString());
}
private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
countingDown = false;
}
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
btnStart.Focus();
timeTarget(ctimeSpan);
}
private void timeTargetchkbox_CheckedChanged(object sender, EventArgs e)
{
if (timeTargetchkbox.Checked == false)
{
dateTimePicker1.Enabled = false;
}
else
{
dateTimePicker1.Enabled = true;
}
optionsfile.SetKey("timetargetcheckbox", timeTargetchkbox.Checked.ToString());
}
private void StartOnRun()
{
watch.Reset();
TimeSpan ctimeSpan = new TimeSpan(0, trackBarHours.Value, trackBarMinutes.Value, trackBarSeconds.Value, 0);
diff = 0;
previousTicks = 0;
ticksDisplayed = ctimeSpan.Ticks;
watch.Start();
btnStart.Text = "STOP";
btnPause.Enabled = true;
btnReset.Enabled = true;
timer1.Enabled = true;
}
private bool GetBool(string keyname)
{
string radiobutton1 = optionsfile.GetKey(keyname);
bool b = false;
if (radiobutton1 != null)
{
bool.TryParse(radiobutton1.Trim(), out b);
}
return b;
}
}
}
和顯示應用程式的螢屏截圖:

uj5u.com熱心網友回復:
我將嘗試進行概括,因為這個問題沒有明確說明要完成的作業,因此很難給出明確的答案。
有很多方法可以實體化一個新TimeSpan的,如此處所述:
https ://learn.microsoft.com/en-us/dotnet/api/system.timespan?view=net-7.0#instantiating-a-timespan-value
如果我試圖堅持并加載 aTimeSpan那么我個人會考慮使用刻度值。例如
// Create a TimeSpan to test with.
var randomTimer = Stopwatch.StartNew();
Thread.Sleep((new Random()).Next(1000,5000)); // Wait 1 to 5 second to get a meaningful value in the example TimeSpan.
var myTimeSpanToSave = randomTimer.Elapsed;
// Save the total ticks here.
var totalEllapsedTicks = myTimeSpanToSave.Ticks;
// Load total ticks and instantiate a new TimeSpan
var newTimeSpanFromTicks = new TimeSpan(totalEllapsedTicks);
我不確定您為什么只想修改 a 的毫秒部分,TimeSpan但假設有正當理由,那么這里有幾個想法。
TimeSpan想法 1 -使用原始物件的值創建一個新物件并僅替換毫秒屬性。
var customMilliseconds = 123;
var newTimeSpanWithCustomMilliseconds = new TimeSpan(myOriginalTimeSpan.Days, myOriginalTimeSpan.Hours, myOriginalTimeSpan.Minutes, myOriginalTimeSpan.Seconds, customMilliseconds);
想法 2 - 使用 Add 清除當前的毫秒值并插入加載的值。
var customMilliseconds = new TimeSpan(0, 0, 0, 0, 123);
var oldMillisecondValueToRemove = new TimeSpan(0, 0, 0, 0, myOriginalTimeSpan.Milliseconds);
myOriginalTimeSpan.Add(-oldMillisecondValueToRemove);
myOriginalTimeSpan.Add(customMilliseconds);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/528325.html
標籤:C#表格
