Catab中的数据绑定DateTimePicker时间

时间:2012-07-12 21:27:02

标签: c# datetimepicker

我有一个带有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)绑定到文本框?我是否需要将毫秒转换或转换为字符或字符串才能在文本框中正确显示它们?
  4. 感谢您的帮助!

    触发编辑表单的代码:

        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;
    

2 个答案:

答案 0 :(得分:0)

您需要使用DateTimePicker.CustomFormat Property

s The one- or two-digit seconds.

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

您不能将DateTimePicker用于毫秒。

答案 1 :(得分:0)

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

  1. 在calendarDataSet中,我更新了两个查询(Fill,GetData和FillById,GetDataBy(@ID))以选择calendarTime作为CONVERT(VARCHAR(12),calendarTime,114)AS calHoursMinsSec
  2. 本质上,我创建了一个包含小时,分钟,秒和毫秒的新列
  3. 在表单上,​​我添加了一个文本框并将文本框绑定到calHoursMinsSec
  4. 注意:我之前尝试将日期时间转换为varchar,但由于操作员错误无疑是不成功的。

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

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

相关问题