C # Datagridview: убедитесь, что редактирование выполняется только с помощью размещенного элемента управления - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть 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;
    }
...