2011-06-23 42 views
2

考慮綁定到某個數據庫的dataGridView。 dataGridView的綁定源有一個過濾器,它只會顯示描述字段爲空的地方。如何停止DataGridView的過濾器設置太靠後移動?

這個想法是,用戶只會看到這個值的記錄,需要他們關注的記錄。用戶將始終將該值更改爲其他值。

我的問題是,一旦他們通過輸入或製表鍵移動到下一行,它幾乎在它們移動到下一行之後過濾,將它的位置移動到它們應該位於的下一行。

有沒有辦法控制這種行爲,以便過濾後位置不會跳到下一行?我不想在這個特定問題的數據集上單獨填寫,儘管我知道這是一個解決方案。如果可能,我想知道如何更好地控制過濾。

編輯

值得一提的是,我還沒有連入datagridview的任何事件,這是拖動控件到窗體,掛鉤綁定源,以它的外的開箱行爲從數據集,並填充form_load事件的數據集。

EDIT

當前行爲的實施例 - (C)表示光標位置

用戶密鑰行#2的名稱和將狀態設置爲TRUE

R1 - John Doe  FALSE 
R2 - Jane Doe  TRUE (C) 
R3 - Rob Doe  FALSE 
R4 - Joe Doe  FALSE 

用戶按下返回(或標籤,無論它在哪個例子中輸入...)

R1 - John Doe  FALSE 
R3 - Rob Doe  FALSE 
R4 - Joe Doe  FALSE (C) 

當前選中的行現在是第4行,它實際上應該是第3行。如果我沒有將R2的值從false更改爲true,則它不會被過濾並且已經正確地將我移動到第3行

編輯

從死裏復活,因爲我還沒有收到適合這個問題的解決方案。那裏的任何人都有創意?^_^

+0

+1寫得很好的問題。 –

回答

1

前段時間我和DataGridView有同樣的問題。
我想改變Enter鍵的行爲來將選定的行向上而不是向下移動。這是我所做的,我希望它能幫助你。我做了一個繼承DataGridView的控件,並且覆蓋了ProcessCmdKey並做了更改。你的情況,你想要做的是:

public partial class MyDataGridView : DataGridView 
{ 
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if (keyData == Keys.Tab || keyData == Keys.Enter) 
     { 
      return true; 
     } 

     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 

這將從按Enter鍵或Tab時移動到下一行停止GridView控件。我希望它適用於你,如果它不請你說出什麼問題。

+0

這肯定會阻止用戶移動到任何地方,這段時間並不是我正在尋找的時間,它們仍然需要跳到下一行。我希望過濾器能夠踢入並將用戶放回應該放置的行中,而不是放在應該放置的位置。這一點很重要,因爲只有在某些標準發生變化時,行纔會被過濾。有幾個原因會導致他們將值保留爲 – Mohgeroth

+0

,您可以在返回真正的寫入代碼以選擇所需單元格之前修改此代碼以執行任何您想要的操作。只需讓你希望光標的單元格像這樣被選中DataGridView.Row [index] .Cells [index] .Selected = true;如果解釋你想要做什麼的話,我可以給你寫一些例子,如示例 – IordanTanev

+0

問題是,爲了讓過濾器生效,你必須離開那一行。如果用戶無法進步,則永遠不會過濾該記錄。它需要過濾該記錄並將光標放到下一條記錄上,不幸的是,一旦過濾器完成更新,它會將光標向下移動兩條記錄 – Mohgeroth