コード例 #1
0
        /// <summary>
        /// 清除
        /// 包括列、数据源
        /// </summary>
        public void Clear()
        {
            ClearData();

            _currentCodon   = null;
            _currentColumns = null;
            _dataGridView.Columns.Clear();

            ContextMenuStrip = null;
        }
コード例 #2
0
        /// <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);
            }
        }
コード例 #3
0
        /// <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]);
        }
コード例 #4
0
        //这里为什么不用泛型方法
        //因为类型可能是由外部变量在运行时决定的,如 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;
            }
        }
コード例 #5
0
        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);
        }
コード例 #6
0
 /// <summary>
 /// 判断指定的 codon 是否使用特定的 BindingList
 /// 如果是,返回 true,如果使用的是默认 BindingList ,返回 false
 /// </summary>
 /// <param name="codon"></param>
 /// <returns></returns>
 private bool IsSpecialBindingList(ITypeBinderDataGridViewTypeCodon codon)
 {
     return(_bindingListPool.Keys.Contains(codon));
 }