1. 程式人生 > 其它 >在為 DataGridView 新增資料列時,彈出 將要新增的列 CellType 屬性為空 錯誤提示與說明

在為 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
注:本人使用過程中暫未發現造成存取不正確的問題