1

我有一个带有 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” ,然后再将值传递给下一个函数。如何传递正确的秒值?
  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);
            }
        }
    }

实例化 datetimepicker 的代码:

    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;
4

2 回答 2

0

您需要使用DateTimePicker.CustomFormat 属性

s The one- or two-digit seconds.

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

您不能在几毫秒内使用 DateTimePicker。

于 2012-07-13T00:00:35.653 回答
0

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

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

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

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

感谢大家的投入!感谢您的指导和建议!

于 2012-07-16T23:09:55.823 回答