winforms 在Visual Studio中使用表单字段更新TimeSpan值时需要帮助

8yoxcaq7  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(125)

我有一个Visual Studio项目,使用supportedRuntime version=“v4.0”和.NETFramework,Version=v4.5.2 with Microsoft Forms。我使用默认的json设置文件来在应用程序启动时加载初始设置。我能够将TextBox和NumericUpDown字段添加到表单中,以读取和更新json文件中的值。
但是,我还没有找到更新TimeSpan值的方法。我尝试使用TextBox和NumericUpDown,这将读取TimeSpan值并在表单字段中显示时间。但是,我无法使用表单字段更新TimeSpan值。我还尝试在我的表单中使用DateTimePicker字段(仅格式化为24小时时间),这也将显示TimeSpan值,但我再次无法使用datetime表单字段编辑该值。例如,将时间从03:00:00更改为04:00:00后,一旦退出字段,该值将恢复为默认值。我在使用TextBox和DateTimePicker时也有同样的行为。
我已经包括了与TimeSpan值相关的应用程序的不同代码片段。此值设置运行SQL备份的时间。

this.TxtPickBackupStartTime.DataBindings.Add(
    nameof(this.TxtPickBackupStartTime.Text), applicationSettings,
    nameof(applicationSettings.StartBackupAt), false,
    DataSourceUpdateMode.OnValidation)

this.TxtPickBackupStartTime = new System.Windows.Forms.TextBox();

this.Controls.Add(this.TxtPickBackupStartTime);

private System.Windows.Forms.TextBox TxtPickBackupStartTime;

public TimeSpan StartBackupAt;

StartBackupAt = new TimeSpan(3, 0, 0),

settings.json file:
"StartBackupAt": "03:00:00",

我目前得到以下错误后,实施奥利弗的建议,下面当替换timeModelBindingSource与applicationSettings.StartBackupAt。

任何帮助将不胜感激。
乔伊
下面是两个部分的代码,我希望能提供更多的信息。

namespace TendBackupApplication.Forms
{
    public partial class SettingsDialog : Form
    {
        private readonly ApplicationSettings applicationSettings;

        public SettingsDialog(ApplicationSettings applicationSettings)
        {
            this.InitializeComponent();
            this.applicationSettings = applicationSettings;

            this.txtTime.DataBindings.Add(new Binding("Text", this.applicationSettings.StartBackupAt, "Time", true, DataSourceUpdateMode.OnValidation, "T"));

.

namespace TendBackupLibrary.Settings
{
    public delegate void ApplicationSettingsSavedEvent(object sender, EventArgs e);

    public class ApplicationSettings
    {
        private readonly SettingsReader settingsReader;
        private readonly SettingsFile defaultSettings;
        private SettingsFile previousSettings;
        private SettingsFile currentSettings;

        public ApplicationSettings(SettingsReader settingsReader)
        {
            this.settingsReader = settingsReader;
            this.defaultSettings = new SettingsFile
            {
                DatabaseName = "Tend",   
                StartBackupAt = new TimeSpan(03, 00, 00),
                BackupInterval = 10
                MaxDatabaseCopies = 1,
                MonitorInterval = 3, // seconds
                MaxMonitorFailures = 3,
                Enabled = true,

下面是TimeSpan函数

public TimeSpan StartBackupAt
{
    get
    {
        return this.currentSettings.StartBackupAt;
    }
    set
    {
        this.currentSettings.StartBackupAt = value;
    }
}

settings.json文件

"DatabaseName": "Tend",
  "StartBackupAt": "03:00:00",
  "BackupInterval": 10,
  "OverwriteDatabase": true,
  "MaxDatabaseCopies": 1,
  "MonitorInterval": 3,
  "MaxMonitorFailures": 3,
  "Enabled": true,
aemubtdh

aemubtdh1#

它通过将TextBox.Text属性绑定到模型类的DateTime属性来工作。只需确保指定T日期/时间格式以抑制日期部分的显示。
范例:

public class TimeModel
{
    public DateTime Time
    {
        get { return new DateTime(TimeSpan.Ticks); }
        set { TimeSpan = value.TimeOfDay; }
    }

    public TimeSpan TimeSpan { get; set; }
}
this.txtTime.DataBindings.Add(new System.Windows.Forms.Binding("Text",
     this.timeModelBindingSource, "Time", true,
     System.Windows.Forms.DataSourceUpdateMode.OnValidation, null, "T"));

更新

现在我看到了你的相关部分代码,我可以更精确的回答了。
将此属性添加到类中

public DateTime StartBackupAtDateTime
{
    get { return new DateTime(StartBackupAt.Ticks); }
    set { StartBackupAt = value.TimeOfDay; }
}

编译您的应用程序,使此新属性对绑定机制可见。
根据WinForms – Bind controls to an object data source中所述的ApplicationSettings类添加BindingSource组件和数据源。
删除文本框中的所有绑定。添加一个新的绑定到您的文本框中解释的链接。也就是说,选择你的TextBox,在属性窗口中选择(DataBindings)/(Advanced),然后从BindingSource下拉列表中选择你的BindingSource组件和StartBackupAtDateTime(而不是链接中的Name)。这会在form.designer.cs文件中自动执行DataBindings.Add操作。
剩下要做的就是将设置分配给BindingSource:

// Replace bindingSource1 by the real name of your BindingSource.
bindingSource1.DataSource = applicationSettings;

请注意,您必须指定整个设置对象,而不是applicationSettings.StartBackupAtDateTime
就这样

相关问题