/// <summary> /// 清除 /// 包括列、数据源 /// </summary> public void Clear() { ClearData(); _currentCodon = null; _currentColumns = null; _dataGridView.Columns.Clear(); ContextMenuStrip = null; }
/// <summary> /// 将指定的 bindingList 分配给指定的 codon /// 如果之前没有为指定的 codon 建立专用的 BindingList,则在 _bindingListPool 建立之 /// </summary> /// <param name="codon"></param> /// <param name="bindingList"></param> private void AllotBindingList(ITypeBinderDataGridViewTypeCodon codon, IBindingListEx bindingList) { Debug.Assert(codon != null && bindingList != null, "codon 或 bindingList 为 null"); if (_bindingListPool.Keys.Contains(codon)) { _bindingListPool[codon] = bindingList; } else { _bindingListPool.Add(codon, bindingList); } }
/// <summary> /// 根据指定的 codon 获取 BindingList /// 如果有与之关联的特定 BindingList,就返回,如果没有,就返回默认 BindingList /// </summary> /// <param name="codon"></param> /// <returns></returns> private IBindingListEx GetBindingList(ITypeBinderDataGridViewTypeCodon codon) { Debug.Assert(codon != null, "codon 为 null"); if (codon == null) { return(null); } Debug.Assert(_bindingListPool.Keys.Contains(codon), "_bindingListPool 中没有指定的 codon 键"); return(_bindingListPool[codon]); }
//这里为什么不用泛型方法 //因为类型可能是由外部变量在运行时决定的,如 Show<e.Type>() ,而实际上这样的写法是不行的 //泛型参数必须在编译之前静态指定 /// <summary> /// 如果 contextData 为 null,不会把当前上下文对象置为null,而是保持当前上下文对象的值 /// </summary> /// <param name="list"></param> /// <param name="type"></param> /// <param name="contextData"></param> public void DataBind(IList list, Type type, object contextData) { //这个地方是没有办法通过 list 取到对象类型的 //集合内可能没有数据,集合本身也无法说明内部数据类型 _currentCodon = GetCodon(type); if (_currentCodon == null) { Clear(); return; } IBindingListEx bindingList = GetBindingList(_currentCodon); LoadColumns(_currentCodon.Columns); this.ContextMenuStrip = _currentCodon.ContextMenuStrip; _dataGridView.DataSource = null; //因为BindingList需要通过内部元素做类型推导,以便绑定数据呈现数据, //只是通过泛型参数object,是不可能获取指定Property的值的 //所以如果list中没有任何元素,就要把对BindingList的初始化和绑定,推迟到添加元素时(否则单元格无法呈现数据) //这种情况主要是针对使用默认 BindingList 的,即 BindingList<object> if (list != null && list.Count > 0) { //_bindingList = new BindingListEx<object>(list.Cast<object>().ToList()); bindingList = _currentCodon.InitializeBindingList(list); if (IsSpecialBindingList(_currentCodon)) { AllotBindingList(_currentCodon, bindingList); } _dataGridView.DataSource = bindingList; } else { bindingList = null; _dataGridView.DataSource = null; } if (contextData != null) { _contextData = contextData; } }
public void AddCodon(ITypeBinderDataGridViewTypeCodon codon) { if (codon == null) { Debug.Assert(false, "codon 为 null"); throw new ArgumentNullException(); } if (_typeBinderDataGridViewTypeCodons.Contains(codon)) { Debug.Assert(false, "_typeBinderDataGridViewTypeCodons 重复添加:" + codon.ToString()); throw new ArgumentException(); } Debug.Assert(GetCodon(codon.DataBoundType) == null, "_typeBinderDataGridViewTypeCodons 重复添加类型:" + codon.ToString()); _typeBinderDataGridViewTypeCodons.Add(codon); IBindingListEx bindingList = null; _bindingListPool.Add(codon, bindingList); }
/// <summary> /// 判断指定的 codon 是否使用特定的 BindingList /// 如果是,返回 true,如果使用的是默认 BindingList ,返回 false /// </summary> /// <param name="codon"></param> /// <returns></returns> private bool IsSpecialBindingList(ITypeBinderDataGridViewTypeCodon codon) { return(_bindingListPool.Keys.Contains(codon)); }