事务:为 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 : 2412366909@qq.com
手机号码:177-7499-4428
注:本人使用过程中暂未发现造成存取不正确的问题
浙公网安备 33010602011771号