繁体   English   中英

C#DateTimePicker

[英]C# DateTimePicker

我有一个带有DateTimePicker控件的WinForm,它显示SQL数据库中的特定日期。

当用户单击它时,我将打开一个自定义表单,询问他们是否确定要更改日期。

如果单击“确定”,则可以使用DateTimePicker继续更改日期,并将更改发布回我的SQL Server数据库中。

如果用户单击“取消”,则该方法将退出,因此不会将任何更改保存到数据库。

但是,令我烦恼的是,即使用户单击“取消”,DateTimePicker下拉日历仍保持打开状态,用户可能会将其解释为未能取消的动作。 如何获取DateTimePicker以关闭打开的下拉日历?

private void datDOA_ValueChanged(object sender, EventArgs e)
    {
        frmConfirmBox frmCB = new frmConfirmBox("Are you sure you want to change the Date of Accident?");
        frmCB.ShowDialog();
        if (frmCB.intButton == 0)
        {                
            return;
        }

        datDOA.Format = DateTimePickerFormat.Long;

        //...Connect to Database...//

        string strCaseNo = txtCaseNo.Text;
        string strConnect = BuildConnectionString();
        SqlConnection linkToDB = new SqlConnection(strConnect);
        linkToDB.Open();

        //...Send User Input to Database...//

        DateTime dateNewDate = datDOA.Value;
        string commandText = "UPDATE tblCases SET DOA = @DOAVal WHERE CaseNo = @CaseNoVal;";
        SqlCommand sqlCom = new SqlCommand(commandText, linkToDB);
        sqlCom.Parameters.Add("@DOAVal", SqlDbType.DateTime);            
        sqlCom.Parameters.Add("@CaseNoVal", SqlDbType.VarChar);
        sqlCom.Parameters["@DOAVal"].Value = dateNewDate;
        sqlCom.Parameters["@CaseNoVal"].Value = strCaseNo;
        sqlCom.ExecuteNonQuery();

        linkToDB.Close();
    }        

您需要保留DateTimePicker控件的旧值才能将其切换回。 另外,您的对话框表单会干扰下拉菜单的关闭,因此您必须给它一个关闭的机会。

像这样:

public partial class Form1 : Form {
  private DateTime _OldValue;

  public Form1() {
    InitializeComponent();
    _OldValue = dateTimePicker1.Value;
    dateTimePicker1.ValueChanged += new EventHandler(dateTimePicker1_ValueChanged);
  }

  void dateTimePicker1_ValueChanged(object sender, EventArgs e) {
    this.BeginInvoke(new MethodInvoker(delegate { ConfirmDateChange(); }));
  }

  private void ConfirmDateChange() {
    frmConfirmBox frmCB = new frmConfirmBox();
    if (frmCB.ShowDialog() == DialogResult.OK) {
      _OldValue = dateTimePicker1.Value;
      // do your database update here
    } else {
      // temporarily stop firing ValueChanged event while we switch it back:
      dateTimePicker1.ValueChanged -= dateTimePicker1_ValueChanged;
      dateTimePicker1.Value = _OldValue;        
      dateTimePicker1.ValueChanged += dateTimePicker1_ValueChanged;
    }
  }
}

我不确定您的要求是什么,但是也许您可以订阅DateTimePicker ValueChanged事件,并且在他们更改所选日期之后,您可以询问他们是否确定要将日期从X更改为Y。如果他们选择“取消”,则可以随时回滚到上一个选定的日期。

编辑:假设您的DateTimePicker的名称是dateTimePicker1:

这是一个名为DTP的示例类,它将完成此操作

     public partial class DTP : Form
     {
        DateTime lastSelectedValue;

        public DTP()
        {
         InitializeComponent();

         lastSelectedValue = dateTimePicker1.Value;
         dateTimePicker1.ValueChanged += new EventHandler(dateTimePicker1_ValueChanged);

         }

    void dateTimePicker1_ValueChanged(object sender, EventArgs e)
    {

        DialogResult di =  MessageBox.Show("Change " + lastSelectedValue.ToString() + " to " + dateTimePicker1.Value.ToString(), "?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)

        if(di== System.Windows.Forms.DialogResult.OK)
        {
            SetSqlDateTimeValue( dateTimePicker1.Value );
            lastSelectedValue =  dateTimePicker1.Value;
        }
        else
        {
             dateTimePicker1.ValueChanged  -= dateTimePicker1_ValueChanged;
            //Setting back the dtp to the old value
            dateTimePicker1.Value = lastSelectedValue;
            dateTimePicker1.ValueChanged += dateTimePicker1_ValueChanged;
        }
    }


    private void SetSqlDateTimeValue(DateTime dateTime)
    {
        throw new NotImplementedException();
    }



}

注意,我已经在顶部声明了一个名为lastSelectedValue的DateTime变量。 然后在更改值之后,我将询问用户是否希望继续执行操作,是否执行SQL任务,是否不执行SQL操作,是否将dateTimePicker1的Value属性设置为lastSelectedValue。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM