简体   繁体   English

C# DataGridView KeyPress

[英]C# DataGridView KeyPress

I have to do a search when a customer types in part of the name name and presses F2.当客户输入部分名称并按 F2 时,我必须进行搜索。

So, if they type "SMI" and press F2, it should search for SMI and give a list of those that fit that criteria.因此,如果他们键入“SMI”并按 F2,它应该搜索 SMI 并给出符合该条件的列表。

Here is my code on KeyPress:这是我在 KeyPress 上的代码:

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);
}

And AccountSearchScreen method:和 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 + "].";
  }
}

My problem is when I set the name here:我的问题是当我在这里设置名称时:

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

It is not applying.它不适用。 The name still shows "SMI".名称仍显示“SMI”。

I believe I know why, correct me if I am wrong.我相信我知道为什么,如果我错了,请纠正我。 The reason why it never changes is due to that I am never loosing focus out of the name field when I press F2, it still has focus so the apply edit never occurs until I leave the field.它永远不会改变的原因是,当我按下 F2 时,我永远不会失去名称字段的焦点,它仍然有焦点,所以在我离开字段之前不会发生应用编辑。 Then the SMI gets applied overwriting the cs.NameOnAccount.然后应用 SMI 覆盖 cs.NameOnAccount。

Is that the case?是这样吗?

Either way, how do I fix this problem?无论哪种方式,我该如何解决这个问题?

Thanks for the help as usual!像往常一样感谢您的帮助!

Though I am not certain about why it is not displayed I can share a few points here.虽然我不确定为什么它没有显示,但我可以在这里分享几点。

  1. Setting a cell value doesn't have anything to do with leaving the cell.设置单元格值与离开单元格没有任何关系。

  2. From the style of code it could be possible that if (dgv_Checks.CurrentRow == null) return;从代码风格来看,如果 (dgv_Checks.CurrentRow == null) return; may cause the control to return before executing other statements.可能会导致控件在执行其他语句之前返回。 You can either comment this line and see how it goes or debug to see the value of dgv_Checks.CurrentRow.您可以评论这一行并查看它的运行情况,也可以调试以查看 dgv_Checks.CurrentRow 的值。 (I can't guess what that is) (我猜不出那是什么)

  3. You may debug to check what's the value of checkTrans.IndividualCheck.NameOnCheckColumn.ColumnName since this serves the index for data row.您可以调试以检查 checkTrans.IndividualCheck.NameOnCheckColumn.ColumnName 的值是什么,因为它为数据行提供索引。 Also check the value in cs.NameOnAccount.还要检查 cs.NameOnAccount 中的值。

In summary, debugging your code should provide you better idea and you may post the debuged values if you still don't get an answer to this.总之,调试您的代码应该为您提供更好的想法,如果您仍然没有得到答案,您可以发布调试后的值。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM