考慮用戶需要以軍事格式輸入時間的數據輸入表單。他們希望從鍵盤上輸入密碼來加速他們的工作,但不希望在小時/分鐘之間鍵入冒號(:)。當數據輸入到DataGridView的單元格中時,我可以在單元驗證之前修改它們的條目嗎?
該列格式化爲允許時間並自動將時間轉換爲標準AM/PM格式。不幸的是,它需要冒號。因此,應該在此輸入上運行轉換方法以嘗試將其轉換爲時間值。
這樣做的方法不是我正在尋找的答案的一部分。它可能代表某人爲什麼想要將用戶鍵入的值更改爲其他值的任何原因。關鍵是它需要在驗證之前發生,所以不會引發DataError事件。
我認爲CellValidating將是正確的地方,這讓我寫了我的預期工作:
private void sampleDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
// Ensure we're looking at the column that requires our attention
if (sampleDataGridView.Columns[e.ColumnIndex].Name == "timeCol")
sampleDataGridView[e.ColumnIndex, e.RowIndex].Value = convertMilitary(e.FormattedValue);
}
當踏進這個代碼單元進行寫入後,事件參數告訴我認爲格式化的值確實是鍵控的,但試圖將其設置爲單元格的當前值不利於驗證。仔細觀察後,我瞭解到該值仍然是用戶輸入之前的值。
這讓我陷入僵局,因爲我沒有看到我會把這個放在哪裏。我覺得我處於正確的位置,但我錯過了一些東西。我在哪裏放置這種轉換,以便DataError事件不會從驗證失敗中引發?
它有可能是我需要設置的不同屬性?它就像我應該改變用戶鍵入的內容,而不是直接像我試圖做的單元格值...
你如何設置格式,你可以顯示代碼? – V4Vendetta 2011-05-13 11:02:03
通過設計器,您可以爲DataGridView中的列選擇默認的單元格樣式。我將其設置爲格式「t」的時間,所以一旦用戶鍵入例如13:40,它將自動向用戶顯示下午1:40。然而,將4位數字修改爲這樣的時間字符串的方法是無關緊要的,只要知道它返回一個有效時間即可。這裏的問題是,我無法追溯通過驗證事件,因爲我猜測,它已經通過我驗證,但格式化的值屬性不能設置,只能檢索。 – Mohgeroth 2011-05-13 15:21:34