DataGridView中的數據格式失效和排序異常

 
Da
DataGridView是一個功能強大的Windows Forms控件,常用於數據錄入和呈現,既可以作爲獨立的表格數據容器,也可以綁定到數據集(如:DataSet/DataTable或實現了IBindingList接口的集合)。同時,在數據呈現時提供了單元格、表格列或表格行的格式化功能,如:對齊、字體、顏色、數據格式等,也提供了單擊表格列頭自動排序的能力。通常,程序中使用DataGridViewTextBoxColumn處理字符與數值型數據。實際應用時卻經常碰到如下兩個令人困惑的現象:
  1. 在定義表格列時設置了DefaultCellStyle的Format格式,如:兩位小數數值的格式是N2,但輸入數據時並沒有按這個要求顯示;
  2. 直接給表格某列的單元賦不同類型的值,如:dataGridView1.Rows[0].Cells[0].Value = 1、dataGridView1.Rows[1].Cells[0].Value = 1.1,此時點該列表頭自動排序,將拋出異常。

 

1)DefaultCellStyle.Format只針對數值型數據

 

在DataGridView的單元格dataGridView1.Rows[1].Cells[0].Value是Object類型,可以接受任何類型的數據。如果直接錄入單元格內容,那麼DataGridView認爲錄入的數據類型爲String,就不會按照格式Format的進行數據的自動格式化,也就看不到希望的格式化後的顯示結果。

 

直接給單元格賦值也存在這個問題。如果給的值是整數、實數,可以呈現格式化的結果。如果給的值是字符文本,將保持默認的文本格式。

 

2)同列單元的數據類型不一致引發排序異常

 

如果直接給同一列的兩個單元格賦不同數據類型的值,例如:整型/實型、整型/字符型,等等:
dataGridView1.Rows.Add(5);
dataGridView1.Rows[0].Cells[0] = 1;
dataGridView1.Rows[1].Cells[0] = 1.1;
上述代碼中,當值爲1時,單元格的ValueType爲int;爲1.1時,單元格的ValueType爲double。那麼,點擊該列做自動排序時將拋出異常“對象必須是Double。”或“對象必須是Int32。”,如果賦給的是整型和字符串,則拋出異常:“對象必須是String。”或“對象必須是Int32。”其原因爲,排序時要求當前列的數據類型全部相同或值爲null,否則使用內置的ICompare做排序操作將拋出異常。

 

解決的方法

 

 

1)使用DataTable數值型字段

 

如果DataGridView綁定到DataTable,且指定表格列Format的字段是數值型的(Int/Double/Single/Decimal),那麼顯示數據時將自動格式化,排序等操作也不存在問題。此時,如果輸入非數值型數據,例如:12..3,將引發DataGridView異常。

 

2)編輯單元格後轉換爲數值型

 

在DataGridView直接錄入單元格值並離開後,將發生一系列的CellXXX事件,順序依次爲:CellLeave、CellValidating、CellParsing、CellValueChanged、CellValidated、CellEndEdit,等等。其中,在單元格的值已經變化(Changed)的情況下,單元格退出編輯模式時發生CellParsing事件,此時可以做數據類型轉換和數值轉換工作:
private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
{
    decimal cellValue = 0;
    string cellContent = e.Value as string;  // DataGridViewTextBoxColumn保證是string類型
    if (!string.IsNullOrEmpty(cellContent))
    {
        decimal.TryParse(cellContent, out cellValue);
    }
    e.Value = cellValue;  // 強制轉換數據類型爲decimal
    e.ParsingApplied = true;
}
給事件的e.Value賦值的同時,單元格的ValueType自動獲得對應值的類型(上述代碼爲decimal)。此時,如果定義了列或單元格的數值顯示格式Format,DataGridView將按該格式顯示。同時,排序也不會出現類型不一致的情況。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章