[200分一个简单问题]datagridview 焦点 我想象PB一样 。在网格中输入一个值,回车。取相应的记录显示在后面列。 但是回车之后 。 焦点到了下一行第一列。 我想保持焦点 在本行下一列。 PS:如果可以 最好不要 从载控件。 PS2:请您实验后在 回答。 不是你想的那么简单。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 添加一个新的从DataGridView继承的类,按如下的代码处理后把项目中使用所有DataGridView使用这个类来代替,可以查找替换: class dataGridViewEx : DataGridView { protected override bool ProcessDialogKey(Keys keyData) { if (keyData == Keys.Return) { if (this.CurrentCell.ColumnIndex + 1 < this.ColumnCount) { this.CurrentCell = this[this.CurrentCell.ColumnIndex + 1, this.CurrentCell.RowIndex]; } else { if (this.CurrentCell.RowIndex < this.Rows.Count) { this.CurrentCell = this[0, this.CurrentCell.RowIndex + 1]; } else { this.CurrentCell = this[0, 0]; } } return true; } return base.ProcessDialogKey(keyData); } protected override bool ProcessDataGridViewKey(KeyEventArgs e) { if (e.KeyData == Keys.Return) { if (this.CurrentCell.ColumnIndex + 1 < this.ColumnCount) { this.CurrentCell = this[this.CurrentCell.ColumnIndex + 1, this.CurrentCell.RowIndex]; } else { if (this.CurrentCell.RowIndex < this.Rows.Count) { this.CurrentCell = this[0, this.CurrentCell.RowIndex + 1]; } else { this.CurrentCell = this[0, 0]; } } return true; } return base.ProcessDataGridViewKey(e); } } 你可以实现自己的操作逻辑,这需要重写合适的键盘、导航、鼠标方法,如DataGridView.OnKeyDown, DataGridView.ProcessDataGridViewKey, DataGridView.SetCurrentCellAddressCore, DataGridView.SetSelectedCellCore, DataGridView.OnMouseDown。等通过自己编写代码获取回车,然后获取当前焦点,得到行列号,最后把它定位到同一列下一行 上面这种方式 从载ProcessDialogKey 事件 我尝试过。。 失败。。 因为 --取相应的记录显示在后面列 class dataGridViewEx : DataGridView { protected override bool ProcessDialogKey(Keys keyData) { if (keyData == Keys.Return) { if (this.CurrentCell.ColumnIndex + 1 < this.ColumnCount) { this.CurrentCell = this[this.CurrentCell.ColumnIndex + 1, this.CurrentCell.RowIndex]; } else { if (this.CurrentCell.RowIndex < this.Rows.Count) { this.CurrentCell = this[0, this.CurrentCell.RowIndex + 1]; } else { this.CurrentCell = this[0, 0]; } } return true; } return base.ProcessDialogKey(keyData); } protected override bool ProcessDataGridViewKey(KeyEventArgs e) { if (e.KeyData == Keys.Return) { if (this.CurrentCell.ColumnIndex + 1 < this.ColumnCount) { this.CurrentCell = this[this.CurrentCell.ColumnIndex + 1, this.CurrentCell.RowIndex]; } else { if (this.CurrentCell.RowIndex < this.Rows.Count) { this.CurrentCell = this[0, this.CurrentCell.RowIndex + 1]; } else { this.CurrentCell = this[0, 0]; } } return true; } return base.ProcessDataGridViewKey(e); } }这个方法我用过。。因为输入只后 触发了cellvaluechanged 事件 焦点还是去了下一行 列2显示相应查询到的数据。//由于 改变了 列2 的值 触发了cellvaluechanged的事件。。 或许从载之后 我从写CELLVALUECHANGED事件 把BASE。XXX 删了 可能 可以。。 但是 最好不从载。。 这和CellValueChanged事件有什么关系啊。难道你处理这个事件了但是有错误?不理解。 我写了 CellValueChanged事件 不过没关系 。 可能我搞错了。。 反正只要 你能达到我的要求就OK。 你发的那个从载 代码我试了。。 不行。。 不修改的话OK 一旦修改值 焦点去了下行 对于取值于言 private void cdgvComponents_CellEndEdit(object sender, DataGridViewCellEventArgs e) { try { SystemDataAccess sda = new SystemDataAccess(); string ActCode = ""; ActCode = cdgvComponents.CurrentRow.Cells["WorkOrderCode"].Value.ToString(); if (e.ColumnIndex == 2) { for (int i = 0; i <= dt_M_WorkOrder.Rows.Count - 1; i++) { if (ActCode.Trim() == dt_M_WorkOrder.Rows[i][0].ToString().Trim()) { cdgvComponents.CurrentRow.Cells["NumCode"].Value = cdgvComponents.CurrentCell.RowIndex + 1; cdgvComponents.CurrentRow.Cells["WorkOrderName"].Value = dt_M_WorkOrder.Rows[i][1].ToString().Trim(); cdgvComponents.CurrentRow.Cells["StandTime"].Value = dt_M_WorkOrder.Rows[i][2].ToString().Trim(); cdgvComponents.CurrentRow.Cells["StandPrice"].Value = dt_M_WorkOrder.Rows[i][3].ToString().Trim(); cdgvComponents.CurrentRow.Cells["ComponentsCode"].Value = txtComponentsCode.Text.Trim(); cdgvComponents.CurrentRow.Cells["Version"].Value = txtVersion.Text.Trim(); } } double sumtime = 0; for (int j = 0; j <= cdgvComponents.RowCount-1; j++) { sumtime += System.Convert.ToDouble(sda.zifobj(cdgvComponents.Rows[j].Cells[4].Value)); } txtStandTime.Text = sumtime.ToString();//计算累加标准工时秒 txtModifyStandTimeS.Text = txtStandTime.Text;//修改记录之标准工时秒 sumtime = 0; for (int j = 0; j <= cdgvComponents.RowCount - 1; j++) { sumtime += System.Convert.ToDouble(sda.zifobj(cdgvComponents.Rows[j].Cells[5].Value)); } txtStandPrice.Text = sumtime.ToString();//计算累加标准工价元 txtModifyStandPriceM.Text = txtStandPrice.Text;//修改记录之标准工价元 } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }//处理输入之数据以上代码仅参考,是我验项目的代码,已验证我想关键是楼主你事件没写对吧,你要取值,用CellEndEdit 是不是说这个错误:由于程序无法提交或取消单元格值更改,操作失败。如果是这样的,那么说明你输入的值是不正确的,DataGridView无法把输入的值提交。只要正确的输入是没有问题的。 不是取值啊。。 在第一个CELL直接输入ID 第2个CELL就显示名称。 我直接写的CELLVALUECHANGED事件。 在里面把查到的值 赋给CELLS[2] 顺便说一句。 我是写了 cellvaluechanged代码的。 private void cdgvComponents_KeyUp(object sender, KeyEventArgs e) { cdgvComponents.Rows[rows ].Cells[1].Selected = true; cdgvComponents.CurrentCell = cdgvComponents.Rows[rows].Cells[1]; }我试过了,用这个代码可以rows是你编辑的当前行,这个要楼主你自己去获取 asp.net技术交流中心 群1:29156948 满 群2:44572142 满 群3:22166975 群4:40338953群5号40339019 满群6:12431253 满只有 3 4还有位置。。请大家加 3号 4号群。。 新手请上论坛学习 http://net.yybmw.cn学习文档 上论坛FTP站点下载这里是学习 交流的地方。请不要灌水或发广告。。违者 立封ID 严重关注!做单据的时候,这个是基本需求的!我以前也是用pb开发可以很轻松的实现以上的功能,但是到了c#我就郁闷了好久啊。我能实现以上的功能,但是可以明显看到焦点的跳转。。用户体验非常的差劲! 在Visual Studio 2005中, 设计好的界面, 如何才能预览一下? 如何批量发布网站 怎么在选中一行后,得到这行BoundColumn的值? asp.net mvc 是怎么判断用户是否是ajax请求的? C# 引用VC++编的 .lib .dll 有没有办法将Form全屏显示? 返回dataset用什么? 操作excel文件的cell问题,急用! 局部变量作用域问题? C#中怎么把数字转换成颜色值? C# 中控件随窗体变化而变化 DataGridView 编辑单元格
class dataGridViewEx : DataGridView
{
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Return)
{
if (this.CurrentCell.ColumnIndex + 1 < this.ColumnCount)
{
this.CurrentCell = this[this.CurrentCell.ColumnIndex + 1, this.CurrentCell.RowIndex];
}
else
{
if (this.CurrentCell.RowIndex < this.Rows.Count)
{
this.CurrentCell = this[0, this.CurrentCell.RowIndex + 1];
}
else
{
this.CurrentCell = this[0, 0];
}
}
return true;
}
return base.ProcessDialogKey(keyData);
}
protected override bool ProcessDataGridViewKey(KeyEventArgs e)
{
if (e.KeyData == Keys.Return)
{
if (this.CurrentCell.ColumnIndex + 1 < this.ColumnCount)
{
this.CurrentCell = this[this.CurrentCell.ColumnIndex + 1, this.CurrentCell.RowIndex];
}
else
{
if (this.CurrentCell.RowIndex < this.Rows.Count)
{
this.CurrentCell = this[0, this.CurrentCell.RowIndex + 1];
}
else
{
this.CurrentCell = this[0, 0];
}
}
return true;
}
return base.ProcessDataGridViewKey(e);
}
}
通过自己编写代码获取回车,然后获取当前焦点,得到行列号,最后把它定位到同一列下一行
{
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Return)
{
if (this.CurrentCell.ColumnIndex + 1 < this.ColumnCount)
{
this.CurrentCell = this[this.CurrentCell.ColumnIndex + 1, this.CurrentCell.RowIndex];
}
else
{
if (this.CurrentCell.RowIndex < this.Rows.Count)
{
this.CurrentCell = this[0, this.CurrentCell.RowIndex + 1];
}
else
{
this.CurrentCell = this[0, 0];
}
}
return true;
}
return base.ProcessDialogKey(keyData);
}
protected override bool ProcessDataGridViewKey(KeyEventArgs e)
{
if (e.KeyData == Keys.Return)
{
if (this.CurrentCell.ColumnIndex + 1 < this.ColumnCount)
{
this.CurrentCell = this[this.CurrentCell.ColumnIndex + 1, this.CurrentCell.RowIndex];
}
else
{
if (this.CurrentCell.RowIndex < this.Rows.Count)
{
this.CurrentCell = this[0, this.CurrentCell.RowIndex + 1];
}
else
{
this.CurrentCell = this[0, 0];
}
}
return true;
}
return base.ProcessDataGridViewKey(e);
}
}这个方法我用过。。因为输入只后 触发了cellvaluechanged 事件 焦点还是去了下一行
或许从载之后 我从写CELLVALUECHANGED事件 把BASE。XXX 删了 可能 可以。。 但是 最好不从载。。
难道你处理这个事件了但是有错误?不理解。
反正只要 你能达到我的要求就OK。 你发的那个从载 代码我试了。。 不行。。 不修改的话OK 一旦修改值 焦点去了下行
private void cdgvComponents_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
try
{
SystemDataAccess sda = new SystemDataAccess();
string ActCode = "";
ActCode = cdgvComponents.CurrentRow.Cells["WorkOrderCode"].Value.ToString();
if (e.ColumnIndex == 2)
{
for (int i = 0; i <= dt_M_WorkOrder.Rows.Count - 1; i++)
{
if (ActCode.Trim() == dt_M_WorkOrder.Rows[i][0].ToString().Trim())
{
cdgvComponents.CurrentRow.Cells["NumCode"].Value = cdgvComponents.CurrentCell.RowIndex + 1;
cdgvComponents.CurrentRow.Cells["WorkOrderName"].Value = dt_M_WorkOrder.Rows[i][1].ToString().Trim();
cdgvComponents.CurrentRow.Cells["StandTime"].Value = dt_M_WorkOrder.Rows[i][2].ToString().Trim();
cdgvComponents.CurrentRow.Cells["StandPrice"].Value = dt_M_WorkOrder.Rows[i][3].ToString().Trim();
cdgvComponents.CurrentRow.Cells["ComponentsCode"].Value = txtComponentsCode.Text.Trim();
cdgvComponents.CurrentRow.Cells["Version"].Value = txtVersion.Text.Trim();
}
}
double sumtime = 0;
for (int j = 0; j <= cdgvComponents.RowCount-1; j++)
{
sumtime += System.Convert.ToDouble(sda.zifobj(cdgvComponents.Rows[j].Cells[4].Value));
}
txtStandTime.Text = sumtime.ToString();//计算累加标准工时秒
txtModifyStandTimeS.Text = txtStandTime.Text;//修改记录之标准工时秒
sumtime = 0;
for (int j = 0; j <= cdgvComponents.RowCount - 1; j++)
{
sumtime += System.Convert.ToDouble(sda.zifobj(cdgvComponents.Rows[j].Cells[5].Value));
}
txtStandPrice.Text = sumtime.ToString();//计算累加标准工价元
txtModifyStandPriceM.Text = txtStandPrice.Text;//修改记录之标准工价元
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}//处理输入之数据以上代码仅参考,是我验项目的代码,已验证我想关键是楼主你事件没写对吧,你要取值,用CellEndEdit
由于程序无法提交或取消单元格值更改,操作失败。
如果是这样的,那么说明你输入的值是不正确的,DataGridView无法把输入的值提交。只要正确的输入是没有问题的。
{
cdgvComponents.Rows[rows ].Cells[1].Selected = true;
cdgvComponents.CurrentCell = cdgvComponents.Rows[rows].Cells[1];
}
我试过了,用这个代码可以
rows是你编辑的当前行,这个要楼主你自己去获取
群1:29156948 满
群2:44572142 满
群3:22166975
群4:40338953
群5号40339019 满
群6:12431253 满只有 3 4还有位置。。请大家加 3号 4号群。。
新手请上论坛学习 http://net.yybmw.cn学习文档 上论坛FTP站点下载这里是学习 交流的地方。请不要灌水或发广告。。违者 立封ID