我想象PB一样 。在网格中输入一个值,回车。取相应的记录显示在后面列。 但是回车之后 。 焦点到了下一行第一列。 我想保持焦点 在本行下一列。  
  PS:如果可以 最好不要 从载控件。   
  PS2:请您实验后在 回答。 不是你想的那么简单。

解决方案 »

  1.   

    添加一个新的从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);
    }
    }
      

  2.   

    你可以实现自己的操作逻辑,这需要重写合适的键盘、导航、鼠标方法,如DataGridView.OnKeyDown, DataGridView.ProcessDataGridViewKey, DataGridView.SetCurrentCellAddressCore,  DataGridView.SetSelectedCellCore, DataGridView.OnMouseDown。等
    通过自己编写代码获取回车,然后获取当前焦点,得到行列号,最后把它定位到同一列下一行
      

  3.   

    上面这种方式  从载ProcessDialogKey 事件 我尝试过。。  失败。。 因为 --取相应的记录显示在后面列
      

  4.   

    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  事件  焦点还是去了下一行
      

  5.   

    列2显示相应查询到的数据。//由于 改变了 列2 的值   触发了cellvaluechanged的事件。。  
      或许从载之后  我从写CELLVALUECHANGED事件   把BASE。XXX  删了 可能 可以。。 但是 最好不从载。。 
      

  6.   

    这和CellValueChanged事件有什么关系啊。
    难道你处理这个事件了但是有错误?不理解。
      

  7.   

    我写了 CellValueChanged事件  不过没关系 。 可能我搞错了。。    
    反正只要 你能达到我的要求就OK。    你发的那个从载 代码我试了。。 不行。。  不修改的话OK   一旦修改值  焦点去了下行
      

  8.   

    对于取值于言
      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
      

  9.   

    是不是说这个错误:
    由于程序无法提交或取消单元格值更改,操作失败。
    如果是这样的,那么说明你输入的值是不正确的,DataGridView无法把输入的值提交。只要正确的输入是没有问题的。
      

  10.   

    不是取值啊。。  在第一个CELL直接输入ID  第2个CELL就显示名称。  我直接写的CELLVALUECHANGED事件。 在里面把查到的值 赋给CELLS[2]
      

  11.   

    顺便说一句。  我是写了 cellvaluechanged代码的。
      

  12.   

    private void cdgvComponents_KeyUp(object sender, KeyEventArgs e)
            {
               
                cdgvComponents.Rows[rows ].Cells[1].Selected = true;
                cdgvComponents.CurrentCell = cdgvComponents.Rows[rows].Cells[1];
            }
    我试过了,用这个代码可以
    rows是你编辑的当前行,这个要楼主你自己去获取
      

  13.   

    asp.net技术交流中心   
    群1:29156948 满  
    群2:44572142 满  
    群3:22166975 
    群4:40338953
    群5号40339019 满
    群6:12431253  满只有  3  4还有位置。。请大家加 3号 4号群。。 
    新手请上论坛学习  http://net.yybmw.cn学习文档 上论坛FTP站点下载这里是学习 交流的地方。请不要灌水或发广告。。违者 立封ID
      

  14.   

    严重关注!做单据的时候,这个是基本需求的!我以前也是用pb开发可以很轻松的实现以上的功能,但是到了c#我就郁闷了好久啊。我能实现以上的功能,但是可以明显看到焦点的跳转。。用户体验非常的差劲!