C # DateTimePicker - PullRequest
       4

C # DateTimePicker

0 голосов
/ 12 января 2012

У меня есть WinForm с элементом управления DateTimePicker, показывающим конкретную дату из моей базы данных 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();
    }        

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Вам необходимо сохранить старое значение элемента управления 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;
    }
  }
}
1 голос
/ 12 января 2012

Я не уверен, каковы ваши требования, но, возможно, вы могли бы подписаться на событие 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();
    }



}

Обратите внимание, что я объявил переменную DateTime с именем lastSelectedValue в верхней части.затем, после изменения значения, я спрашиваю пользователя, желает ли он продолжить, если он дозирует, я делаю SQL, если он этого не делает, я установлю для свойства Value объекта dateTimePicker1 значение lastSelectedValue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...