在為 DataGridView 新增資料列時,彈出 將要新增的列 CellType 屬性為空 錯誤提示與說明
事務:為 DataGridView 新增資料列[也可以說是直接操作 DataGridView 資料列...]...
原由:在為 DataGridView 新增列的時候,[至少這是第三次遇到] 彈出 新增列 的 CellType 為空值...的錯誤提示
>>> 慢慢回想曾經遇到過的情況,且已是解好過,始終沒有想起...檢視為 DataGridView 控制元件 所新增的列屬性時,發現 所建立的 列是基於 DataGridViewCell 的派生類,如:DataGridViewTextBoxCell [ ComboBox/CheckBox... ] ,當然,也就是這個問題了[以前也是這麼解決的,由於記性不好,所以部落格記錄一下...],這個派生類能指明的就是對應 DataGridViewCell 基類的 CellType 屬性
明白:由於測試過使用 DataGridViewCell dgvc=dataGridView1.Columns[0].Clone() as DataGridViewCell 等方法均是不行的,所以,由此申明的 cell 是沒有預設 CellType 屬性的,必須使用其派生類例項化...
以下是附帶相關基本的函式程式碼:
#region 插入列 /// <summary> /// [綜合方法:參考] 插入列,在其對應的屬性 DataSourse = null 的情況下使用,如:DataSourse 未用 DataTable/DataSet 等賦的情況下[如果有其賦值,可用操作 DataTable 的列來控制] /// 測試:正確 2021/06/23 16:18:44 /// </summary> /// <param name="dgv"></param> /// <param name="insCelTyp">列單元格型別,其對應的列屬性為 CellType 列單元控制元件型別 [即:如果出現 CellTyp 為空時,即為未指明此屬性,因為 DataGridViewCell 沒有預設的指向型別]</param> /// <param name="hedTxt">列 HeaderText </param> public static void Ins(DataGridView dgv, DataGridViewCell insCelTyp, string hedTxt) { #region int dspIdx; F.Ctrs.Dgv.Col.DspIdx(dgv, out dspIdx); if (dspIdx < 0) return; Ins(dgv, insCelTyp, hedTxt, dspIdx); #endregion } #endregion #region 左/右移列 /// <summary> /// 綜合以上3種情況 /// </summary> /// <param name="dgv"></param> /// <param name="movRit"></param> public static void Mov4(DataGridView dgv, bool movRit) { DataGridViewColumn dgvC; int dspIdx; DspIdx(dgv, out dgvC, out dspIdx); if (dspIdx < 0) return; Mov(dgvC, movRit); } #endregion #region 刪除列 /// <summary> /// 綜合以上3種情況 [但可能需要小心使用] /// </summary> /// <param name="dgv"></param> public static void Del4(DataGridView dgv) { DataGridViewColumn dgvC; int dspIdx; DspIdx(dgv, out dgvC, out dspIdx); if (dspIdx < 0) return; Del(dgvC); } #endregion #region 綜合呼叫函式 /// <summary> /// 獲取 可能的 滑鼠點選列的 顯示 排序 索引 號 /// 測試:正確 2021/06/23 17:04:44 /// 註明:此函式具有可補充的情況邏輯[或更簡單的替代解決方法]... /// </summary> /// <param name="dgv"></param> /// <param name="dspIdx"></param> /// <returns></returns> public static bool DspIdx(DataGridView dgv, out DataGridViewColumn dgvC, out int dspIdx) { #region dgvC = null; dspIdx = -1; dgvC = dgv.SortedColumn; if (dgvC == null) { int cnt = dgv.SelectedColumns.Count; if (cnt > 0) dgvC = dgv.SelectedColumns[0]; else { DataGridViewCell dgvc = dgv.CurrentCell; if (dgvc == null) return false; else dgvC = dgvc.OwningColumn; } } dspIdx = dgvC.DisplayIndex; return true; #endregion } #endregion
補充:關於直接操作 DataGridView 資料列的說法是相對 DataGridView.DataSource 屬性而言,即如果 其DataSource = DataTable, 應該是可以通過 操作 DataTable 資料列來操作 DataGridView 資料列 [書時未嚴格測試,但以往有這樣的做法,且記得是可行的...]
交流 QQ : [email protected]
手機號碼:177-7499-4428
注:本人使用過程中暫未發現造成存取不正確的問題