簡體   English   中英

C#中的數據綁定DateTimePicker時間

[英]Databound DateTimePicker Time in C#

我有一個帶有2個datetimepicker控件的Windows窗體:一個用於日期,另一個用於時間的datetimepicker控件。 這兩個控件都綁定到數據庫中的同一列,並且控件具有不同的屬性名稱(即dateEdit和timeEdit)和不同的格式(即Long和Time)。

這是我的問題/疑問:

  1. 即使數據庫條目(在本例中為時間修剪)為“ 14:34”,timeEdit選擇器也會忽略數據庫條目中的秒數,並將時間秒數設置為“ 00”,如“ 2:34:00”中所示。 31.891123 -04:00”。 如何獲得正確顯示的秒數?
  2. 每當我將timeEdit選擇器中的秒數從“ 00”編輯為(例如)“ 15”時(如“ 2:34:15”),選擇器都會將值傳遞給下一個功能之前將秒數重置為“ 00”。 如何傳遞正確的秒值?
  3. 我想編輯時間的毫秒數。 對我來說,最好將修剪后的毫秒數(使用DATEPART)綁定到文本框? 我是否需要將毫秒轉換或轉換為char或字符串,以便在文本框中正確顯示它們?

謝謝你的幫助!

觸發編輯表單的代碼:

    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;

您需要使用DateTimePicker.CustomFormat屬性

s The one- or two-digit seconds.

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

您不能使用DateTimePicker毫秒。

問題已解決,但我不確定如何做到。 這是我所做的:

  1. 在calendarDataSet中,我更新了兩個查詢(Fill,GetData和FillById,GetDataBy(@ID)),以選擇calendarTime作為CONVERT(VARCHAR(12),calendarTime,114)AS calHoursMinsSec
  2. 本質上,我創建了一個用小時,分鍾,秒和毫秒創建的新列
  3. 在表單上,​​我添加了一個文本框並將該文本框綁定到calHoursMinsSec

注意:毫無疑問,由於操作員錯誤,我之前嘗試將datetime轉換為varchar均未成功。

保存表單后,綁定似乎仍然存在,並且我能夠將相關變量傳遞給更新函數

感謝大家的投入! 感謝您的指導和建議!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM