Проблема с фокусом и двойным щелчком в ячейке DataGridView, содержащей MaskedTextBox

У меня проблема при попытке редактировать ячейку, содержащую маскированное текстовое поле:

Если я попытаюсь отредактировать поле, мне нужно:

  1. двойной щелчок по ячейке (на этом шаге становится видимым маскированное текстовое поле)
  2. нажмите на поле еще раз, чтобы начать редактирование
  3. установить курсор «вручную» в первую позицию maskedtextbox

(4. начните вводить значение)

Можно как-то избежать «ручной» фокусировки на первую позицию маскированного текстового поля? (например, при одиночном или двойном щелчке: установите видимость маскированного текстового поля и в то же время установите фокус/курсор на первую позицию для маскированного текстового поля)

Я пробовал с: focus(), select(), SelectionStart, CurrentCell, но безуспешно.

Я добавил MaskedTextbox в ячейку DataGridView следующим образом:

public Insert()
    {
        InitializeComponent();

        this.maskedTextBox = new MaskedTextBox();

        this.maskedTextBox.Visible = false;

        this.dataGridView1.Controls.Add(this.maskedTextBox);

        this.dataGridView1.CellBeginEdit += new DataGridViewCellCancelEventHandler(dataGridView1_CellBeginEdit);

        this.dataGridView1.CellEndEdit += new DataGridViewCellEventHandler(dataGridView1_CellEndEdit);

        this.dataGridView1.Scroll += new ScrollEventHandler(dataGridView1_Scroll);
    }

    void dataGridView1_Scroll(object sender, ScrollEventArgs e)
    {
        if (this.maskedTextBox.Visible)
        {
            Rectangle rect = this.dataGridView1.GetCellDisplayRectangle(
                this.dataGridView1.CurrentCell.ColumnIndex,
                this.dataGridView1.CurrentCell.RowIndex, true);
            this.maskedTextBox.Location = rect.Location;
        }
    }
    void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
    {
        if (e.ColumnIndex == this.dataGridView1.Columns[4].Index || e.ColumnIndex == this.dataGridView1.Columns[5].Index && e.RowIndex > -1)
        {
            string type = "";
            if (this.dataGridView1[e.ColumnIndex, e.RowIndex].Value != null)
                type = this.dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();

            this.maskedTextBox.Mask = "0000.00.00";
            Rectangle rect =
               this.dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);

            this.maskedTextBox.Location = rect.Location;
            this.maskedTextBox.Size = rect.Size;
            this.maskedTextBox.Text = "";

            if (this.dataGridView1[e.ColumnIndex, e.RowIndex].Value != null)
            {
                this.maskedTextBox.Text = this.dataGridView1[e.ColumnIndex,
                    e.RowIndex].Value.ToString();
            }
            this.maskedTextBox.Visible = true;
            this.maskedTextBox.Focus(); //tried
            this.maskedTextBox.Select(0, 0);
            this.maskedTextBox.SelectionStart =0 ;
            dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
        }
    }
void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
if (this.maskedTextBox.Visible && (e.ColumnIndex == this.dataGridView1.Columns["TEST"].Index && e.RowIndex > -1))
            {
                this.dataGridView1.CurrentCell.Value = maskedTextBox.Text;
                this.maskedTextBox.Visible = false;
            }
        }

person Molnar Istvan    schedule 01.04.2020    source источник
comment
Попробуйте использовать пользовательскую версию столбца DataGridView. См. раздел столбец DataGridView Masked TextBox.   -  person LarsTech    schedule 01.04.2020
comment
проблема в том, что этот код используется во многих формах, а в datagridview есть и другие элементы управления (например, элементы управления полем со списком), которые реализованы так же, как приведенное выше маскированное текстовое поле.   -  person Molnar Istvan    schedule 01.04.2020


Ответы (1)


Элементу управления, вероятно, необходимо получить фокус после выполнения метода BeginEdit, поэтому попробуйте сделать это следующим образом:

this.BeginInvoke(new Action(() => {
  this.maskedTextBox.Visible = true;
  this.maskedTextBox.Focus();
  this.maskedTextBox.Select(0, 0);
}));
person LarsTech    schedule 01.04.2020
comment
отличный ответ, это работает! я немного переписываю код, потому что использую .net 2.0 в VS 2005: this.BeginInvoke((MethodInvoker)delegate() { this.maskedTextBox.Visible = true; this.maskedTextBox.Focus(); this.maskedTextBox.Select(0, 0); });, большое спасибо! - person Molnar Istvan; 01.04.2020