datagridview加了combobox控件后 ,当输入0时,0跳到文本最前面,焦点移到了Datagridview了,处理方法
combobox加入keydown事件捕捉键盘输入0的动作,下面是代码
引用http://www.360doc.com/content/10/0805/11/2286640_43803573.shtml
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
//此Form中有两个控件,一个DataGridView(dataGridView1),一个ComboBox(comboBox1)
//DataGridView中有两列(都是DataGridViewTextBoxColumn的),其中第一列实现类似ComboBox的功能
//第一列中只有正在编辑的Cell才会显示ComboBox,其他的不会显示,这样好看一点
namespace Test
{
public partial class Form1 : Form
{
private int comboBoxColumnIndex = 0; // DataGridView的首列
public Form1()
{
InitializeComponent();
InitComboBoxValues();
this.dataGridView1.Controls.Add(this.comboBox1);
this.dataGridView1.CellEnter += new
DataGridViewCellEventHandler(dataGridView1_CellEnter);
this.dataGridView1.CellLeave+=new
DataGridViewCellEventHandler(dataGridView1_CellLeave);
}
private void InitComboBoxValues()
{
this.comboBox1.Items.AddRange(new String[] { "Beijing",
"Shanghai", "Guangzhou", "Wuhan", "Shenzhen" });
this.comboBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
//输入提示
this.comboBox1.AutoCompleteSource =
AutoCompleteSource.ListItems;
}
private void dataGridView1_CellEnter(object sender,
DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == comboBoxColumnIndex)
{
//此处cell即CurrentCell
DataGridViewCell cell =
this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
Rectangle rect =
this.dataGridView1.GetCellDisplayRectangle(cell.ColumnIndex,
cell.RowIndex, true);
this.comboBox1.Location = rect.Location;
this.comboBox1.Size = rect.Size;
comfirmComboBoxValue(this.comboBox1, (String)cell.Value);
this.comboBox1.Visible = true;
}
///注意下面此句的变化
comboBox1.Focus();
//注意上面此句的变化
}
//当用户在combobox1输入0时,0会跳到最前面,光标会跳到Datagridview里,似乎必须放在keydown事件,keyup不行
private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.D0 || e.KeyCode == Keys.NumPad0))
{
comboBox1.Focus();
comboBox1.SelectionStart = comboBox1.Text.Length;
}
}
private void dataGridView1_CellLeave(object sender,
DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == comboBoxColumnIndex)
{
//此处cell不为CurrentCell
DataGridViewCell cell =
this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
cell.Value = this.comboBox1.Text;
this.comboBox1.Visible = false;
}
}
private void comfirmComboBoxValue(ComboBox com, String cellValue)
{
com.SelectedIndex = -1;
if (cellValue == null)
{
com.Text = "";
return;
}
com.Text = cellValue;
foreach (Object item in com.Items)
{
if ((String)item == cellValue)
{
com.SelectedItem = item;
}
}
}
}
}