C# 聚焦并双击包含MaskedTextBox的DataGridView单元格中的问题

C# 聚焦并双击包含MaskedTextBox的DataGridView单元格中的问题,c#,.net,winforms,datagridview,maskedtextbox,C#,.net,Winforms,Datagridview,Maskedtextbox,尝试编辑包含maskedtextbox的单元格时出现问题: 如果我试图编辑字段,我需要: 双击单元格(在此步骤中,maskedtextbox变为可见) 再次单击该字段开始编辑 将光标“手动”设置为maskedtextbox的第一个位置 (4.开始输入值) 是否有可能以某种方式避免“手动”聚焦到遮罩文本框的第一个位置?(例如,单击一次或双击:将maskedtextbox设置为可见,同时将焦点/光标设置在maskedtextbox的第一个位置) 我尝试了:focus()、select()、Selec

尝试编辑包含maskedtextbox的单元格时出现问题:

如果我试图编辑字段,我需要:

  • 双击单元格(在此步骤中,maskedtextbox变为可见)
  • 再次单击该字段开始编辑
  • 将光标“手动”设置为maskedtextbox的第一个位置
  • (4.开始输入值)

    是否有可能以某种方式避免“手动”聚焦到遮罩文本框的第一个位置?(例如,单击一次或双击:将maskedtextbox设置为可见,同时将焦点/光标设置在maskedtextbox的第一个位置)

    我尝试了:focus()、select()、SelectionStart、CurrentCell,但没有成功

    我通过以下方式向DataGridView单元格添加了一个MaskedTextbox:

    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;
                }
            }
    

    控件可能需要在BeginEdit方法完成后获得焦点,因此请尝试以下方法:

    this.BeginInvoke(new Action(() => {
      this.maskedTextBox.Visible = true;
      this.maskedTextBox.Focus();
      this.maskedTextBox.Select(0, 0);
    }));
    

    尝试使用自定义DataGridView列版本。请参阅。问题是:此代码用于许多表单,datagridview也有其他控件(如combobox控件),它们的实现方式与上面的maskedtextboxperfect答案相同,它可以工作!我重写了一段代码,因为我正在VS2005中使用.NET2.0:
    this.BeginInvoke((MethodInvoker)delegate(){this.maskedTextBox.Visible=true;this.maskedTextBox.Focus();this.maskedTextBox.Select(0,0);}),非常感谢!