【问题标题】:Databound DateTimePicker Time in C#C# 中的数据绑定 DateTimePicker 时间
【发布时间】:2012-07-12 21:27:02
【问题描述】:

我有一个带有 2 个 datetimepicker 控件的 Windows 窗体:一个用于日期,另一个用于时间的 datetimepicker 控件。这两个控件都绑定到数据库中的同一列,并且控件具有不同的属性名称(即 dateEdit 和 timeEdit)和不同的格式(即 Long 和 Time)。

这是我的问题/疑问:

  1. timeEdit 选择器会忽略数据库条目中的任何秒数,并将时间秒数设置为“00”,如“2:34:00”,即使数据库条目(在此插图中修剪为时间)是“14 :34:31.891123 -04:00”。如何让秒数正确显示?
  2. 每当我将 timeEdit 选择器中的秒数从“00”编辑为(例如)“15”时,例如在“2:34:15”中,选择器会将秒数重置为“00”之前 em> 将值传递给下一个函数。如何传递正确的秒值?
  3. 我想编辑时间的毫秒数。将修剪后的毫秒(使用 DATEPART)绑定到文本框对我来说最好吗?我是否需要将毫秒转换或转换为字符或字符串才能在文本框中正确显示它们?

感谢您的帮助!

触发编辑表单的代码:

    private void timeDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        try
        {
            if (e.ColumnIndex == 5)
            {
                EditTime editForm = new EditTime((Guid)timeDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);

                editForm.StartPosition = FormStartPosition.CenterScreen;
                editForm.ShowDialog();
                editForm.Close();
            }
        }
        catch (Exception ex)
        {
            string msg = "Error: ";
            msg += ex.Message;
            throw new Exception(msg);
        }
    }

表格代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Configuration;
    using System.Data;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace StatusManager
    {
        public partial class EditTime : Form
        {
            private Guid calendarId;

            public EditTime()
            {
                InitializeComponent();
            }

            public EditTime(Guid Id)
            {
                InitializeComponent();
                calendarId = Id;
            }

            public string GetConnectionString()
            {
                var connString = ConfigurationManager.ConnectionStrings["StatusManager.Properties.Settings.StatusConnectionString"].ConnectionString;
                return connString;
            }

            private void UpdateCalendarItem(string dateEdit, string timeEdit, string note)
            {
                var conn = new SqlConnection(GetConnectionString());

                const string UpdateStatusSql = @"UPDATE dbo.statuses SET
                calendarTime = @timeOffset
                notes = @note 
                WHERE PK_calendarUID = @PK_calendarUID";

                try
                {
                    SqlCommand cmd = new SqlCommand(UpdateSql, conn);
                    var param = new SqlParameter[3];

                    param[0] = new SqlParameter("@PK_calendarUID", calendarId);

                    //Convert date(s) to correct format
                    string dateTimeCombined = dateEdit + " " timeEdit;
                    DateTime timeConverted = Convert.ToDateTime(dateTimeCombined);
                    DateTimeOffset timeOffset = new DateTimeOffset(timeConverted);

                    param[1] = new SqlParameter("@timeOffset", timeOffset);
                    param[2] = new SqlParameter("@note", note);

                    foreach (SqlParameter t in param)
                    {
                        cmd.Parameters.Add(t);
                    }

                    conn.Open();
                    cmd.CommandType = CommandType.Text;
                    cmd.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    string msg = "Error updating 'calendarItems': ";
                    msg += ex.Message;
                    throw new Exception(msg);
                }
                finally
                {
                    conn.Close();
                }          
            }

            private void editTimeButton_Click(object sender, EventArgs e)
            {
                UpdateCalendarItem(dateEdit.Text, timeEdit.Text, notes.Text);

                this.Close();
            }

            private void EditTime_Load(object sender, EventArgs e)
            {
                this.locationsTableAdapter.Fill(this.locationsDataSet.locations);
                this.calendarTableAdapter.FillById(this.calendarDataSet.calendarItems, calendarId);
            }
        }
    }

实例化日期时间选择器的代码:

    this.timeEdit.CustomFormat = "";
    this.timeEdit.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.calendarBindingSource, "calendarTime", true));
    this.timeEdit.Format = System.Windows.Forms.DateTimePickerFormat.Time;
    this.timeEdit.Location = new System.Drawing.Point(385, 30);
    this.timeEdit.Name = "timeEdit";
    this.timeEdit.ShowUpDown = true;
    this.timeEdit.Size = new System.Drawing.Size(89, 20);
    this.timeEdit.TabIndex = 2;

【问题讨论】:

  • 你能展示你正在使用的代码示例吗?还有你是如何实例化 dtp 控件的。
  • 根据 DateTimePickerFormat documentation,选择Time 时使用的格式由您的计算机在 Windows 的区域和语言设置中设置。您能告诉我们您在 Windows 中的 Short Time 和 Long Time 格式是什么吗?
  • 另外,您可以尝试将格式设置为自定义并将其设置为 hh:mm:ss(未验证的格式,来自内存)。
  • @DJKRAZE 我是 C# 新手。什么是“dtp 控件”
  • @SuperOli 我确实尝试将 timeEdit 属性设置为 Custom 和 HH:mm:ss tt;我仍然无法获得正确的值来传递给下一个函数

标签: c# datetimepicker


【解决方案1】:

你需要使用DateTimePicker.CustomFormat Property

s The one- or two-digit seconds.

ss The two-digit seconds. Single digit values are preceded by a 0.

您不能在毫秒内使用 DateTimePicker。

【讨论】:

  • 设置自定义格式不起作用/解决问题:timeEdit 选择器不超过秒。单击表单上的“更新”按钮时,我可以看到 timeEdit 选择器将选择器中的秒数物理重置为“00”传递不正确的时间之前(例如, “04:15:00”而不是“04:15:30”到下一个函数。
  • 当您单击更新按钮时,可能会重置秒数。尝试使用具有简单形式的 DateTimePicker 并查看更新秒数时会发生什么。
【解决方案2】:

问题已解决,但我不确定如何解决。这是我所做的:

  1. 在 calendarDataSet 中,我更新了两个查询(Fill、GetData 和 FillById、GetDataBy (@ID))以选择 calendarTime 作为 CONVERT(VARCHAR(12), calendarTime, 114) AS calHoursMinsSec
  2. 本质上,我创建了一个包含小时、分钟、秒和毫秒的新列
  3. 在表单上,​​我添加了一个文本框并将该文本框绑定到 calHoursMinsSec

注意:我之前将日期时间转换为 varchar 的尝试失败无疑是由于操作员错误。

保存表单后,绑定似乎粘住了,我能够将相关变量传递给更新函数

感谢大家的意见!感谢您的指导和建议!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多