2013-10-11 8 views
1

Я изменяю код, который имеет настраиваемый элемент управления календаря, используя DateTimePicker для DataGridView. Я установил ShowCheckBox = true, и я пытаюсь заставить его изменить значение даты на null, когда пользователь нажимает на этот флажок (путем изменения CustomFormat of Date), который работает. Моя проблема в том, что для изменения параметра DateFormat требуется слишком много кликов. Моя основная CalendarColumn происходит от http://msdn.microsoft.com/en-us/library/7tas5c80.aspx, но это не включает флажок и не допускает нулевые значения.DateTimePicker требуется несколько щелчков флажка, чтобы запустить OnValueChanged

Мой OnValueChanged() код:

protected override void OnValueChanged(EventArgs eventargs) 
    { 
     // Notify the DataGridView that the contents of the cell 
     // have changed. 
     base.OnValueChanged(eventargs); 

     if (this.Checked) 
     { 
      this.Checked = true; 
      this.Format = DateTimePickerFormat.Short; 
     } else if (!this.Checked) 
     { 
      this.Format = DateTimePickerFormat.Custom; 
      this.CustomFormat = " "; 
     } 
    } 

Первый нажмите на флажок (если это значение проверяется) затемняется даты, но не срабатывает метод OnValueChanged(), второй щелчок устанавливает его обратно " checked "и запускает событие, а третий щелчок устанавливает CustomFormat на" "и, следовательно, отображает нулевую дату, как следует.

Я провел некоторое исследование, и я думаю, что моя проблема связана с приобретением фокуса ячейки при первом щелчке, но если я поместил свой чек в onGotFocus(), один клик покажет/скроет формат даты, как следует, но затем, когда я нажимаю на другую ячейку после снятия флажка, он остается с CustomFormat, установленным как «", а не DateTimePickerFormat.Short.

Другие ответы по аналогичной теме относятся к http://www.mofeel.net/70-microsoft-public-dotnet-framework-windowsforms/8806.aspx, но я смущен относительно того, как я включил бы это в свой код. Я не опубликовал весь класс, но могу, если кто-нибудь подумает, что это поможет?

ответ

1

Колледж исправил это для меня. Я попытаюсь объяснить, как могу:

Мой OnValueChanged() метод в конечном итоге выглядит как:

protected override void OnValueChanged(EventArgs eventargs) 
{ 
    valueChanged = true; 
    // Notify the DataGridView that the contents of the cell 
    // have changed. 

    this.EditingControlDataGridView.NotifyCurrentCellDirty(true); 
    base.OnValueChanged(eventargs); 

    isChecked(); 
} 

public bool isChecked() 
{ 
    bool isChecked = false; 
    if (this.Checked) 
    { 
     this.Checked = true; 
     this.Format = DateTimePickerFormat.Short; 
     isChecked = true; 
    } 
    else if (!this.Checked) 
    { 
     this.Format = DateTimePickerFormat.Custom; 
     this.CustomFormat = " "; 
     isChecked = false; 
    } 
    return isChecked; 
} 

Он также добавил эти методы:

protected override void OnClick(EventArgs e) 
{ 
    isChecked(); 
    base.OnClick(e); 
}  

public object EditingControlFormattedValue 
{ 
    get 
    { 
     if (!this.Checked) 
     { 
      return String.Empty;      
     } 
     else 
     { 
      if (this.Format == DateTimePickerFormat.Custom) 
      { 
       return this.Value.ToString(); 
      } 
      else 
      { 
       return this.Value.ToShortDateString(); 
      } 
     } 
    } 
    set 
    { 
     string newValue = value as string; 
     if (!String.IsNullOrEmpty(newValue)) 
     { 
      this.Value = DateTime.Parse(newValue); 
     } 
    } 
} 

InitializaEditingControl также был отредактирован:

public override void InitializeEditingControl(int rowIndex, object 
     initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) 
{ 
    // Set the value of the editing control to the current cell value. 
    base.InitializeEditingControl(rowIndex, initialFormattedValue, 
     dataGridViewCellStyle); 
    ctl = DataGridView.EditingControl as CalendarEditingControl; 
    // ctl.Invalidated += new InvalidateEventHandler(ctl_Invalidated); 
    ctl.ValueChangedSpecial += new EventHandler(ctl_ValueChangedSpecial); 
    if (rowIndex >= 0) 
    { 
     try 
     {      
      if (String.IsNullOrEmpty(this.Value.ToString())) 
      { 
       ctl.Checked = false; 
       ctl.Format = DateTimePickerFormat.Custom; 
       ctl.CustomFormat = " "; 
      } 
      else 
      { 
       ctl.Checked = true; 
       ctl.Value = (DateTime)this.Value; 
       ctl.Format = DateTimePickerFormat.Short;    
      } 
     } 
     catch (ArgumentOutOfRangeException aex) 
     { 
      //MessageBox.Show("ERROR. " + aex.Message); 
      ctl.Value = (DateTime)this.DefaultNewRowValue; 
     } 
    } 
} 

И тогда это сработало.

Этот ответ почти наверняка неудовлетворительный, но вопросы без ответа никому не помогают, поэтому, надеюсь, что-то здесь может помочь кому-то другому.