2011-05-31 72 views
1

当客户输入名称名称的一部分并按F2时,我必须进行搜索。C#DataGridView KeyPress

因此,如果他们键入“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.NameOnAccount。

是这样吗?

无论哪种方式,我该如何解决这个问题?

非常感谢您的帮助!

+0

这是一个WinForm应用程序吗? – 2011-05-31 16:23:32

+0

这是一个C#WinForms应用程序 – ErocM 2011-05-31 17:21:44

+0

我无法重现,但在设置DGV单元值后尝试调用'dgv_Checks.EndEdit();'。 – 2011-05-31 17:38:43

回答

0

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

  1. 设置单元值与离开单元没有任何关系。

  2. 从代码的样式可能是,如果(dgv_Checks.CurrentRow == null)返回;可能导致控件在执行其他语句之前返回。您可以对此行进行注释并查看它的行为或调试以查看dgv_Checks.CurrentRow的值。 (我猜不出是什么)

  3. 您可能会调试以检查checkTrans.IndividualCheck.NameOnCheckColumn.ColumnName的值是什么,因为它为数据行提供索引。同时检查cs.NameOnAccount中的值。

总之,调试你的代码应该会给你更好的想法,如果你还没有得到答案,你可以发布debuged值。

+0

1.我明白它不会,但是如果EditedFormattedValue在您离开单元格后覆盖该值,那么它会。 2.我正在设置value = cs.NameOnAccount的位置。 NameOnAccount确实有一个值,它会设置值,因为它在设置它之后显示它。显示没有更新,并且在我离开单元格后,该值以SMI结尾。 – ErocM 2011-05-31 16:34:23