包含 MaskedTextBox 的 DataGridView 单元格中的焦点和双击问题
Focus and Double Click problem in a DataGridView cell that contains a MaskedTextBox
我在尝试编辑包含屏蔽文本框的单元格时遇到问题:
如果我尝试编辑我需要的字段:
- 双击该单元格(在此步骤中,屏蔽的文本框变为可见)
- 再次单击该字段开始编辑
- 将光标"manually"设置到maskedtextbox的第一个位置
(4.开始输入值)
是否可以通过某种方式避免 "manual" 聚焦到 maskedtextbox 的第一个位置? (例如在单击或双击时:将 maskedtextbox 设置为可见,同时将焦点/光标设置在 maskedtextbox 的第一个位置)
我试过: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;
}
}
在 BeginEdit 方法完成后控件可能需要获得焦点,所以尝试这样:
this.BeginInvoke(new Action(() => {
this.maskedTextBox.Visible = true;
this.maskedTextBox.Focus();
this.maskedTextBox.Select(0, 0);
}));
我在尝试编辑包含屏蔽文本框的单元格时遇到问题:
如果我尝试编辑我需要的字段:
- 双击该单元格(在此步骤中,屏蔽的文本框变为可见)
- 再次单击该字段开始编辑
- 将光标"manually"设置到maskedtextbox的第一个位置
(4.开始输入值)
是否可以通过某种方式避免 "manual" 聚焦到 maskedtextbox 的第一个位置? (例如在单击或双击时:将 maskedtextbox 设置为可见,同时将焦点/光标设置在 maskedtextbox 的第一个位置)
我试过: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;
}
}
在 BeginEdit 方法完成后控件可能需要获得焦点,所以尝试这样:
this.BeginInvoke(new Action(() => {
this.maskedTextBox.Visible = true;
this.maskedTextBox.Focus();
this.maskedTextBox.Select(0, 0);
}));