У меня есть DataGridView с элементом управления DateTimePicker, размещенным в одном из столбцов.При выборе даты в настоящий момент она присваивается значению ячейки, но, поскольку я разрешаю редактировать ячейку для использования событий CellBeginEdit и CellEndEdit, вы также можете ввести текст в столбец, который может быть недопустимым.Как сделать так, чтобы редактирование ячейки было включено только через DateTimePicker?Смотрите частичное решение ниже:
DateTimePicker dtpVisit;
private void Form_Load(object sender, EventArgs e)
{
dtpVisit = new DateTimePicker();
dtpVisit.Format = DateTimePickerFormat.Short;
dtpVisit.Visible = false;
dtpVisit.Width = 100;
//DataGridView is called activities
activities.Controls.Add(dtpVisit);
dtpVisit.ValueChanged += this.dtpVisit_ValueChanged;
...
}
private void activities_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
try
{
if((activities.Focused) && (activities.CurrentCell.ColumnIndex == 5))
{
dtpVisit.Location = activities.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false).Location;
dtpVisit.Visible = true;
dtpVisit.Focus();
if (activities.CurrentCell.Value != DBNull.Value)
{
dtpVisit.Value = (DateTime)activities.CurrentCell.Value;
}
else
{
dtpVisit.Value = DateTime.Today;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void activities_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
try
{
if((activities.Focused) && (activities.CurrentCell.ColumnIndex == 5))
{
activities.CurrentCell.Value = dtpVisit.Value.Date;
dtpVisit.Visible = false;
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void dtpVisit_ValueChanged(object sender, EventArgs e)
{
activities.CurrentCell.Value = dtpVisit.Text;
}
private void activities_Scroll(object sender, ScrollEventArgs e)
{
dtpVisit.Visible = false;
}