你曾帮我的网址:http://topic.csdn.net/u/20090201/15/7e6ac895-1832-4cdb-9548-55d3342652e1.html,,谢谢
我的代码:
void dgvEmp_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
DataGridViewTextBoxEditingControl ctlTxt = (DataGridViewTextBoxEditingControl)e.Control;
if (ctlTxt != null) {
ctlTxt.KeyDown += new KeyEventHandler(ctlTxt_KeyDown);
}
}
void ctlTxt_KeyDown(object sender, KeyEventArgs e)
{
string str = "";
}
2 个解决方案
#1
Tab和Enter键在DataGridView中有约定俗成的作用。
实际上Tab/Enter在消息预处理的时候就被处理了,起到上下导航或关闭编辑控件等作用,而不会再派发给具体的TextBoxEditingControl。
所以,当TextBox让它的父控件进行消息预检查的时候,父控件要说他不处理:
同时,要让TextBox愿意接受那些特殊按键:
上述代码使你可以响应Tab和回车键事件。
改变Tab/Enter键的默认作用会给那些习惯于用Tab键移动到下一单元的用户感到不适应(再去点鼠标?)。
同时DataGridView的单元格的固定高度也并不适合显示多行的文本(Shift+Enter可输入多行文本)。
俗话说强扭的瓜不甜,我会建议用一个其他控件来另外编辑需要多行和Tab格的文本,而不要让TextBoxEditingControl来做它不适合做的任务。
实际上Tab/Enter在消息预处理的时候就被处理了,起到上下导航或关闭编辑控件等作用,而不会再派发给具体的TextBoxEditingControl。
所以,当TextBox让它的父控件进行消息预检查的时候,父控件要说他不处理:
class MyDGV : DataGridView
{
protected override bool ProcessKeyPreview(ref Message m)
{
if (this.EditingControl is DataGridViewTextBoxEditingControl)
{
KeyEventArgs e = new KeyEventArgs(((Keys)((int)m.WParam)) | Control.ModifierKeys);
if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Tab)
{
return false;
}
}
return base.ProcessKeyPreview(ref m);
}
}
//记得在Form1.Designer.cs中创建DataGridView要换成:this.dataGridView1 = new MyDGV();
同时,要让TextBox愿意接受那些特殊按键:
void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
DataGridViewTextBoxEditingControl textEditor = e.Control as DataGridViewTextBoxEditingControl;
if (textEditor != null)
{
textEditor.AcceptsReturn = true;
textEditor.Multiline = true;
textEditor.AcceptsTab = true;
textEditor.KeyDown += new KeyEventHandler(textEditor_KeyDown);
}
}
void textEditor_KeyDown(object sender, KeyEventArgs e)
{
System.Diagnostics.Trace.TraceInformation(sender + "....." + e.KeyCode);
}
上述代码使你可以响应Tab和回车键事件。
改变Tab/Enter键的默认作用会给那些习惯于用Tab键移动到下一单元的用户感到不适应(再去点鼠标?)。
同时DataGridView的单元格的固定高度也并不适合显示多行的文本(Shift+Enter可输入多行文本)。
俗话说强扭的瓜不甜,我会建议用一个其他控件来另外编辑需要多行和Tab格的文本,而不要让TextBoxEditingControl来做它不适合做的任务。
#2
谢了,,
#1
Tab和Enter键在DataGridView中有约定俗成的作用。
实际上Tab/Enter在消息预处理的时候就被处理了,起到上下导航或关闭编辑控件等作用,而不会再派发给具体的TextBoxEditingControl。
所以,当TextBox让它的父控件进行消息预检查的时候,父控件要说他不处理:
同时,要让TextBox愿意接受那些特殊按键:
上述代码使你可以响应Tab和回车键事件。
改变Tab/Enter键的默认作用会给那些习惯于用Tab键移动到下一单元的用户感到不适应(再去点鼠标?)。
同时DataGridView的单元格的固定高度也并不适合显示多行的文本(Shift+Enter可输入多行文本)。
俗话说强扭的瓜不甜,我会建议用一个其他控件来另外编辑需要多行和Tab格的文本,而不要让TextBoxEditingControl来做它不适合做的任务。
实际上Tab/Enter在消息预处理的时候就被处理了,起到上下导航或关闭编辑控件等作用,而不会再派发给具体的TextBoxEditingControl。
所以,当TextBox让它的父控件进行消息预检查的时候,父控件要说他不处理:
class MyDGV : DataGridView
{
protected override bool ProcessKeyPreview(ref Message m)
{
if (this.EditingControl is DataGridViewTextBoxEditingControl)
{
KeyEventArgs e = new KeyEventArgs(((Keys)((int)m.WParam)) | Control.ModifierKeys);
if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Tab)
{
return false;
}
}
return base.ProcessKeyPreview(ref m);
}
}
//记得在Form1.Designer.cs中创建DataGridView要换成:this.dataGridView1 = new MyDGV();
同时,要让TextBox愿意接受那些特殊按键:
void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
DataGridViewTextBoxEditingControl textEditor = e.Control as DataGridViewTextBoxEditingControl;
if (textEditor != null)
{
textEditor.AcceptsReturn = true;
textEditor.Multiline = true;
textEditor.AcceptsTab = true;
textEditor.KeyDown += new KeyEventHandler(textEditor_KeyDown);
}
}
void textEditor_KeyDown(object sender, KeyEventArgs e)
{
System.Diagnostics.Trace.TraceInformation(sender + "....." + e.KeyCode);
}
上述代码使你可以响应Tab和回车键事件。
改变Tab/Enter键的默认作用会给那些习惯于用Tab键移动到下一单元的用户感到不适应(再去点鼠标?)。
同时DataGridView的单元格的固定高度也并不适合显示多行的文本(Shift+Enter可输入多行文本)。
俗话说强扭的瓜不甜,我会建议用一个其他控件来另外编辑需要多行和Tab格的文本,而不要让TextBoxEditingControl来做它不适合做的任务。
#2
谢了,,