2012-01-12 30 views
0

私は、SQLデータベースから特定の日付を示すDateTimePickerコントロールを持つWinFormを持っています。C#DateTimePicker

ユーザーがクリックすると、自分の日付を変更するかどうかを尋ねるカスタムフォームが開きます。

[OK]をクリックすると、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

アップだかどうか確認するためにここにあなたのコードを入れてください。 –

+0

DateTimePicket.Visible = false; – Lloyd

+2

ドロップダウンは通常、コントロールがフォーカスを失ったときに閉じます。どうやってそれを開いたままにしていますか? – LarsTech

答えて

1

私はあなたの要件が何であるかわからないんだけど、おそらくあなたは、DateTimePickerのValueChangedイベントをサブスクライブすることができ、彼らが選択した日付を変更した後、彼らは変更することを確信している場合、あなたがそれらを求めることができますXからYまでの日付です。キャンセルを選択した場合は、常に前の選択した日付にロールバックできます。

EDIT: あなたのDateTimePickerの名前がdateTimePicker1であると仮定します。ここでは

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



} 

通告を行いますDTPという名前のサンプルクラスですトップ。値が変更された後、私は彼が進捗したいかどうかをユーザに尋ねるでしょう。もし私がSQLをやるならば、もしdateTimePicker1のValueプロパティをlastSelectedValueに設定しなければならないでしょう。

+0

すでに変更されている場合、以前の値にロールバックするにはどうすればよいですか? – PJW

+0

サンプルコードを含むように投稿を編集しました –

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