С# DateTimePicker

У меня есть WinForm с элементом управления DateTimePicker, показывающим определенную дату из моей базы данных SQL.

Когда пользователь нажимает на нее, у меня открывается настраиваемая форма, чтобы спросить, уверены ли они, что хотят изменить дату.

Если они нажмут 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();
    }        

person PJW    schedule 12.01.2012    source источник
comment
Поместите свой код здесь, чтобы проверить, что случилось.   -  person DmitryBoyko    schedule 12.01.2012
comment
DateTimePicket.Visible = ложь;   -  person Lloyd    schedule 12.01.2012
comment
Выпадающий список обычно закрывается, когда элемент управления теряет фокус. Как ты держишь его открытым?   -  person LarsTech    schedule 12.01.2012
comment
Я попытался изменить фокус на другой элемент управления, но календарь остается открытым. Что касается установки Visible = false, это приведет к тому, что DateTimePicker полностью исчезнет из поля зрения, а это не то, что мне нужно. Я просто хочу, чтобы «раскрывающийся календарь», который появляется при нажатии DateTiemPicker, исчез.   -  person PJW    schedule 12.01.2012
comment
Почему мой вопрос был отмечен?   -  person PJW    schedule 12.01.2012


Ответы (2)


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

person Slime recipe    schedule 12.01.2012
comment
Как мне вернуться к предыдущему значению, если оно уже изменилось? - person PJW; 12.01.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;
    }
  }
}
person LarsTech    schedule 12.01.2012