2012-01-12 62 views
0

我有一個帶有DateTimePicker控件的WinForm,它顯示了我的SQL數據庫中的特定日期。C#DateTimePicker

當用戶點擊它時,我有一個自定義表單打開,詢問他們是否確定要更改日期。

如果他們點擊確定,他們可以繼續使用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(); 
    }   
+0

把你的代碼在這裏檢查什麼事。 – 2012-01-12 17:45:21

+0

DateTimePicket.Visible = false; – Lloyd 2012-01-12 17:45:22

+2

當控件失去焦點時,下拉通常會關閉。你如何保持開放? – LarsTech 2012-01-12 17:48:34

回答

1

我不知道你有什麼要求,但也許你可以訂閱的DateTimePicker ValueChanged事件後,他們改變了選擇的日期,你可以問他們,如果他們確信,他們想改變從X到Y的日期。如果他們選擇取消,您總是可以回滾到上一個選定的日期。

編輯: 假設你的DateTimePicker的名稱是dateTimePicker1:

這裏是一個名爲DTP樣品類,將做到這一點我聲明瞭一個名爲lastSelectedValue在一個DateTime varible只是

 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(); 
    } 



} 

公告頂端。那麼在值被改變之後,我會詢問用戶他是否希望繼續,如果他的劑量我做SQL的話,如果他不想將dateTimePicker1的Value屬性設置爲lastSelectedValue。

+0

如果它已經更改,我該如何回滾到以前的值? – PJW 2012-01-12 18:05:48

+0

編輯我的帖子以包含示例代碼 – 2012-01-12 18:29:00

2

您需要保留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; 
    } 
    } 
}