2011-05-31 74 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