C#DataGridView按键

C#DataGridView按键,c#,winforms,datagridview,C#,Winforms,Datagridview,当客户键入部分姓名并按F2时,我必须进行搜索 因此,如果他们键入“SMI”并按F2键,它应该搜索SMI并给出符合该条件的列表 这是我在按键上的代码: private void ScanCheckKeyDown(object sender, KeyEventArgs e) { // Search for customer if (e.KeyCode == Keys.F2) AccountSearchScreen(); // Cancel ACH Process if (e.

当客户键入部分姓名并按F2时,我必须进行搜索

因此,如果他们键入“SMI”并按F2键,它应该搜索SMI并给出符合该条件的列表

这是我在按键上的代码:

private void ScanCheckKeyDown(object sender, KeyEventArgs e)
{
  // Search for customer
  if (e.KeyCode == Keys.F2)
    AccountSearchScreen();
  // Cancel ACH Process
  if (e.KeyCode == Keys.F3)
    if (backgroundWorker1.IsBusy) CancelAsyncButtonClick(sender, e);
  // Scan Checks
  if (e.KeyCode == Keys.F5)
    ButtonScanChecksClick(sender, e);
  // Submit & Close Batch
  if (e.KeyCode == Keys.F8)
    ButtonSaveClick(sender, e);
}
和AccountSearchScreen方法:

private void AccountSearchScreen()
{
  if (dgv_Checks.CurrentRow == null) return;
  var dr = dgv_Checks.CurrentRow;
  //var name =      dr.Cells[checkTrans.IndividualCheck.NameOnCheckColumn.ColumnName].Value.ToString().Trim().ToUpper();     
  //dr.Cells[checkTrans.IndividualCheck.NameOnCheckColumn.ColumnName].Value = name;     
  var searchkey = dr.Cells[checkTrans.IndividualCheck.NameOnCheckColumn.ColumnName].EditedFormattedValue == null ? string.Empty :
                  dr.Cells[checkTrans.IndividualCheck.NameOnCheckColumn.ColumnName].EditedFormattedValue.ToString().Trim().ToUpper(); 
  if (searchkey.Length == 0)
  {
    dr.Cells[checkTrans.IndividualCheck.NameOnCheckColumn.ColumnName].ErrorText = "Please enter part of the last name to search.";
    return;
  }

  var cs = new CustomerSearch(searchkey);
  cs.ShowDialog(this);

  if (cs.Branch != null && cs.Branch.Trim().Length == 2 && cs.AccountNumber != null && cs.AccountNumber.Trim().Length == 5)
  {
    dr.Cells[checkTrans.IndividualCheck.NameOnCheckColumn.ColumnName].ErrorText = string.Empty;
    dr.Cells[checkTrans.IndividualCheck.NameOnCheckColumn.ColumnName].Value = cs.NameOnAccount;
    dr.Cells[checkTrans.IndividualCheck.BranchColumn.ColumnName].Value = cs.Branch;
    dr.Cells[checkTrans.IndividualCheck.AccountBalanceColumn.ColumnName].Value = GetAccountBalance(cs.Branch + cs.AccountNumber);
    dr.Cells[checkTrans.IndividualCheck.AccountNumberColumn.ColumnName].Value = cs.AccountNumber;
  }
  else
  {
    dr.Cells[checkTrans.IndividualCheck.NameOnCheckColumn.ColumnName].ErrorText = "No account found for [" + dr.Cells[checkTrans.IndividualCheck.NameOnCheckColumn.ColumnName].Value + "].";
  }
}
我的问题是在此处设置名称时:

dr.Cells[checkTrans.IndividualCheck.NameOnCheckColumn.ColumnName].Value=cs.NameOnAccount

它不适用。名称仍然显示“SMI”

我相信我知道为什么,如果我错了,请纠正我。它从未改变的原因是,当我按下F2键时,我从未失去名称字段的焦点,它仍然有焦点,因此在我离开该字段之前,应用编辑从未发生。然后应用SMI覆盖cs.nameoAccount

是这样吗

不管怎样,我如何解决这个问题


像往常一样谢谢你的帮助

虽然我不确定为什么不显示它,但我可以在这里分享几点

  • 设置单元格值与离开单元格无关

  • 从代码样式来看,如果(dgv_Checks.CurrentRow==null)返回;可能导致控件在执行其他语句之前返回。您可以对此行添加注释并查看其运行情况,也可以调试以查看dgv_Checks.CurrentRow的值。(我猜不出那是什么)

  • 您可以调试以检查checkTrans.IndividualCheck.NameOnCheckColumn.ColumnName的值,因为它为数据行提供索引。还要检查cs.nameoAccount中的值


  • 总之,调试代码应该会给您提供更好的想法,如果您仍然没有得到答案,您可以发布调试后的值。

    这是WinForm应用程序吗?它是C#WinForms应用程序我无法复制,但请尝试调用
    dgv_Checks.EndEdit()设置DGV单元格值后。是否确定KeyDown事件在网格单元格处于编辑模式时捕获在网格单元格中输入的击键?我没有看到这方面的事件。1.我知道没有,但如果EditedFormattedValue在您离开单元格后覆盖了该值,则它会。2.我正在到达设置值=cs.nameoAccount的位置。NameOnAccount确实有一个值,它设置该值,因为它在设置后显示该值。显示没有更新,在我离开单元格后,该值最终成为SMI。