C# 停止C中datagridview的行选择更改#
我正在制作一个程序,我们只需按enter键,就可以通过数据网格视图编辑或插入记录。问题是,每当我在任何单元格中写入值并按enter键时,行选择都会更改为下一行 当我按enter键时,我希望它不会更改选定的行。它应该只是离开单元格编辑或移动到下一个单元格C# 停止C中datagridview的行选择更改#,c#,datagridview,C#,Datagridview,我正在制作一个程序,我们只需按enter键,就可以通过数据网格视图编辑或插入记录。问题是,每当我在任何单元格中写入值并按enter键时,行选择都会更改为下一行 当我按enter键时,我希望它不会更改选定的行。它应该只是离开单元格编辑或移动到下一个单元格 当刚刚选中行时,我在按enter键时遇到了相同的问题。我通过从行索引中减去一来解决这个问题,但是如何解决单元格问题呢?您可能会认为网格中有一个属性,可以在按下enter键时更改选择的移动方式。不幸的是,DataGridView没有此属性。我猜第三
当刚刚选中行时,我在按enter键时遇到了相同的问题。我通过从行索引中减去一来解决这个问题,但是如何解决单元格问题呢?您可能会认为网格中有一个属性,可以在按下enter键时更改选择的移动方式。不幸的是,
DataGridView
没有此属性。我猜第三方库可能有一个具有此功能的网格
下面是从@Cody Gray的回答中得出的一个可能的解决方案。。。当试图连接网格KeyDown
或其他用于“网格”的“关键”事件时,他的回答触及了这个问题。这意味着当用户在单元格中“编辑”时,这些事件不会触发。在大多数情况下,您应该使用gridsEditingControlShowing
事件来捕获单个单元格键事件。这看起来很简单;然而,尚不清楚“何时”应该这样做
例如,当用户按enter键时,使用下面的任一解决方案都将按照所述水平而不是垂直移动选择…但是…。仅当用户在按下“回车”键时“编辑”单元格时,此功能才起作用。如果用户只需“点击”另一个单元格,然后按“回车”键,选择将向下移动
我相信,在单元格未被编辑的情况下,您可以使用此功能。我想问的问题是…把“回车”键变成“制表”键值得吗?如果要在编辑的单元格之外实现此功能,我相信在实现此功能后,您会意识到刚才实现的功能已在“Tab”键中可用。只是一个重新发明轮子的想法
正如Cody的回答所暗示的,使用“DataGridView”基本事件进行描述并不是一件简单的事情。此解决方案基本上创建了一个类,该类继承自DataGridView
,并覆盖gridsProcessCmdKey
事件。这里您可以实现所描述的行为,但是,如上所述,只有在编辑单元格时才会发生水平移动
class MyDataGridView : DataGridView {
protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData) {
if ((keyData == (Keys.Enter))) {
if (this.CurrentCell.IsInEditMode) {
Point lastPosition = new Point(this.CurrentCell.ColumnIndex, this.CurrentCell.RowIndex);
if (lastPosition.X == this.ColumnCount - 1) {
lastPosition.X = 0;
lastPosition.Y++;
}
else {
lastPosition.X++;
}
this.CurrentCell = this.Rows[lastPosition.Y].Cells[lastPosition.X];
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
@Asaf在上面同一链接中的回答提供了一个使用网格基本事件的示例。下面是使用这两种方法的完整示例。将一个DataGridView
和一个myDataGridView
放到表单上,以使代码正常工作。希望这有帮助
DataTable GridTable;
DataTable GridTable2;
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
GridTable = GetTable();
FillTable(GridTable);
dataGridView1.DataSource = GridTable;
GridTable2 = GetTable();
FillTable(GridTable2);
myDataGridView1.DataSource = GridTable2;
}
private DataTable GetTable() {
DataTable dt = new DataTable();
dt.Columns.Add("Col1", typeof(string));
dt.Columns.Add("Col2", typeof(string));
dt.Columns.Add("Col3", typeof(string));
dt.Columns.Add("Col4", typeof(string));
return dt;
}
private void FillTable(DataTable dt) {
for (int i = 0; i < 15; i++) {
dt.Rows.Add("C1R" + i, "C2R" + i, "C3R" + i, "C4R" + i);
}
}
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) {
if (e.Control is DataGridViewTextBoxEditingControl) {
DataGridViewTextBoxEditingControl tb = e.Control as DataGridViewTextBoxEditingControl;
tb.PreviewKeyDown -= dataGridView1_PreviewKeyDown;
tb.PreviewKeyDown += dataGridView1_PreviewKeyDown;
}
}
private void dataGridView1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) {
if (e.KeyData == Keys.Enter) {
//if (dataGridView1.CurrentCell.IsInEditMode) {
Point lastPosition = new Point(dataGridView1.CurrentCell.ColumnIndex, dataGridView1.CurrentCell.RowIndex);
if (lastPosition.X == dataGridView1.ColumnCount - 1) {
lastPosition.X = 0;
lastPosition.Y++;
}
else {
lastPosition.X++;
}
dataGridView1.CurrentCell = dataGridView1.Rows[lastPosition.Y].Cells[lastPosition.X];
//}
//else {
// good luck here
//}
}
}
DataTable-GridTable;
数据表GridTable2;
公共表格1(){
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e){
GridTable=GetTable();
填充表(网格表);
dataGridView1.DataSource=GridTable;
GridTable2=GetTable();
可填充(网格表2);
myDataGridView1.DataSource=GridTable2;
}
私有数据表GetTable(){
DataTable dt=新的DataTable();
添加(“Col1”,typeof(string));
添加(“Col2”,typeof(string));
添加(“Col3”,typeof(string));
添加(“Col4”,typeof(string));
返回dt;
}
专用空白填充表(数据表dt){
对于(int i=0;i<15;i++){
添加(“C1R”+i,“C2R”+i,“C3R”+i,“C4R”+i”);
}
}
私有void dataGridView1_EditingControlShowing(对象发送方,DataGridViewEditingControlShowingEventArgs e){
如果(例如,控件是DataGridViewTextBoxedEdit控件){
DataGridViewTextBoxEditingControl tb=e.控件作为DataGridViewTextBoxEditingControl;
tb.PreviewKeyDown-=dataGridView1\u PreviewKeyDown;
tb.PreviewKeyDown+=dataGridView1\u PreviewKeyDown;
}
}
私有void dataGridView1_PreviewKeyDown(对象发送方,PreviewKeyDownEventArgs e){
如果(e.KeyData==Keys.Enter){
//if(dataGridView1.CurrentCell.IsInEditMode){
Point lastPosition=新点(dataGridView1.CurrentCell.ColumnIndex、dataGridView1.CurrentCell.RowIndex);
if(lastPosition.X==dataGridView1.ColumnCount-1){
lastPosition.X=0;
lastPosition.Y++;
}
否则{
lastPosition.X++;
}
dataGridView1.CurrentCell=dataGridView1.Rows[lastPosition.Y].Cells[lastPosition.X];
//}
//否则{
//祝你好运
//}
}
}
您是否考虑过按“Tab”键而不是“Enter”键?是的,Tab键工作正常,但我想在编辑单元格时停止Enter键的功能