今天收到“寒枫天伤 - PSP”的问题(老大,名字能不能简单点,好难打也),询问载体设计的问题,乱谈一下吧,不好你当胡扯蛋了。

载体的设计有俩个思路,一个是表格式的,一个是层次的。

      ms的ADO、DataSet就是表格式的,采用行、列组成的表,然后表集合之间建立联系。他更贴近关系型数据库的结构,因此使用简单、可以充分利用已经成熟的大量研究成果。缺点就是他是抽象的,不直观。

      通常的xml和O/R的设计就是层次的,局部来说也是行(集合)、列(属性)组成表(对象),区别是表(对象)之间不是平等的关系,而是建立了有点像树一样的结构。好处吗,编写代码的时候看着舒服些罗(不是我打击你),缺点吗,一沓子了,我最头大的是数据跟踪问题。

      我无法在一片文章中说明所有的事情,例如序列化、继承原则、CRUD、数据跟踪一大堆要处理的事情。

      先说说 IBindList和ICancelAddNew接口吧,IBindList是列表绑定的基础接口,他继承于IList接口,如果你想绑定到某个表格或者列表中,IList基本上够了(实际上数组和ICollection也可以),但IBindList提供是否能新增、编辑和删除的选项,还提供排序、查找等功能(我可没有实现这个复杂的功能,我使用表格本身的功能),最重要的是他提供了ListChanged事件,这个是你通知外界你的集合发生改变的最好途径,所以你的集合最好是实现IBindList,而不紧紧是IList。

      ICancelAddNew接口用在表格的编辑中,你使用表格的时候都知道你新建一行的时候可以按ESC键取消新建,实际内部的工作原理是:已经新建了行并添加到行集合,当你按ESC时,删除掉刚才的一行,所以你必须记住刚才新建的行是第多少行。

(如果没有记错的话,.net 1.1是没有这个接口的 ,.net 2.0才有)

      下面的代码是部分的集合代码(不能运行的),不要以为我能写多好的程序,其实我是抄System.ComponentModel.Collections.Generic.BindingList<T>的。

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题
using System;
回复 寒枫天伤 - PSP 的问题
using System.Collections;
回复 寒枫天伤 - PSP 的问题
using System.ComponentModel;
回复 寒枫天伤 - PSP 的问题
using Mango.Common.Data;
回复 寒枫天伤 - PSP 的问题
using Mango.Common.Properties;
回复 寒枫天伤 - PSP 的问题
using System.Reflection;
回复 寒枫天伤 - PSP 的问题
#endregion
回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题
namespace Mango.Common.Data
{

回复 寒枫天伤 - PSP 的问题    public class DataRowCollectionBase : CollectionBase, IBindingList, IList, ICollection, IEnumerable, ICancelAddNew
{
回复 寒枫天伤 - PSP 的问题        
// Fields
回复 寒枫天伤 - PSP 的问题
        private int addNewPos;
回复 寒枫天伤 - PSP 的问题        
private bool hookingItems;
回复 寒枫天伤 - PSP 的问题        
private PropertyChangedEventHandler onItemPropertyChanged;
回复 寒枫天伤 - PSP 的问题        
private bool allowNew;
回复 寒枫天伤 - PSP 的问题        
private bool allowEdit;
回复 寒枫天伤 - PSP 的问题        
private bool allowRemove;
回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题        
private Type _itemType;
回复 寒枫天伤 - PSP 的问题        
private object _parent;
回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题        
// Events
回复 寒枫天伤 - PSP 的问题
        public event AddingNewEventHandler AddingNew;
回复 寒枫天伤 - PSP 的问题        
public event ListChangedEventHandler ListChanged;
回复 寒枫天伤 - PSP 的问题


回复 寒枫天伤 - PSP 的问题        public DataRowCollectionBase()
{
回复 寒枫天伤 - PSP 的问题            
this.addNewPos = -1;
回复 寒枫天伤 - PSP 的问题            
this.allowNew = true;
回复 寒枫天伤 - PSP 的问题            
this.allowEdit = true;
回复 寒枫天伤 - PSP 的问题            
this.allowRemove = true;
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        public DataRowCollectionBase(object parent) :this()
{
回复 寒枫天伤 - PSP 的问题            _parent 
= parent;
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题        
#endregion
回复 寒枫天伤 - PSP 的问题


回复 寒枫天伤 - PSP 的问题        
/// 获取集合类的名细类型
回复 寒枫天伤 - PSP 的问题        
/// </summary>
回复 寒枫天伤 - PSP 的问题        protected virtual Type GetCollectionItemType()
{
回复 寒枫天伤 - PSP 的问题            
if (_itemType == null)
{
回复 寒枫天伤 - PSP 的问题                Type collType 
= this.GetType();
回复 寒枫天伤 - PSP 的问题                
object[] ps = collType.GetCustomAttributes(typeof(DbCollectionAttribute), true);
回复 寒枫天伤 - PSP 的问题                
if (ps == null || ps.Length == 0)
回复 寒枫天伤 - PSP 的问题                    
throw new ApplicationException(string.Format(Resources.Error_NotSetDbCollAtt, collType.Name));
回复 寒枫天伤 - PSP 的问题                _itemType 
= ((DbCollectionAttribute)ps[0]).TypeContainedInCollection;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题            
return _itemType;
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected virtual void OnAddingNew(AddingNewEventArgs e)
{
回复 寒枫天伤 - PSP 的问题            
if (this.AddingNew != null)
{
回复 寒枫天伤 - PSP 的问题                
this.AddingNew(this, e);
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        private object FireAddingNew()
{
回复 寒枫天伤 - PSP 的问题            AddingNewEventArgs addNewArgs 
= new AddingNewEventArgs(null);
回复 寒枫天伤 - PSP 的问题            
this.OnAddingNew(addNewArgs);
回复 寒枫天伤 - PSP 的问题            
return addNewArgs.NewObject;
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected override void OnInsert(int index, object value)
{
回复 寒枫天伤 - PSP 的问题            
//检查新对象的父对象
回复 寒枫天伤 - PSP 的问题
            DataRowBase row = value as DataRowBase;
回复 寒枫天伤 - PSP 的问题            
if (row != null)
{
回复 寒枫天伤 - PSP 的问题                
if (row.Parent != null)
回复 寒枫天伤 - PSP 的问题                    
throw new ArgumentException(Resources.Error_ColHaveParent);
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题            
this.EndNew(this.addNewPos);
回复 寒枫天伤 - PSP 的问题            
this.HookItem(value, true);
回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题            
base.OnInsert(index, value);
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected override void OnInsertComplete(int index, object value)
{
回复 寒枫天伤 - PSP 的问题            
//设置新对象的父对象
回复 寒枫天伤 - PSP 的问题
            DataRowBase row = value as DataRowBase;
回复 寒枫天伤 - PSP 的问题            
if (row != null)
回复 寒枫天伤 - PSP 的问题                row.SetParent(_parent);
回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题            
base.OnInsertComplete(index, value);
回复 寒枫天伤 - PSP 的问题            
this.FireListChanged(ListChangedType.ItemAdded, index);
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        object IBindingList.AddNew()
{
回复 寒枫天伤 - PSP 的问题            
object newObject = this.AddNewCore();
回复 寒枫天伤 - PSP 的问题            
this.addNewPos = (newObject != null? base.List.IndexOf(newObject) : -1;
回复 寒枫天伤 - PSP 的问题            
return newObject;
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected virtual object AddNewCore()
{
回复 寒枫天伤 - PSP 的问题            
object newObject = this.FireAddingNew();
回复 寒枫天伤 - PSP 的问题            
if (newObject == null)
{
回复 寒枫天伤 - PSP 的问题                newObject 
= Activator.CreateInstance(GetCollectionItemType());
回复 寒枫天伤 - PSP 的问题                
//自动填充关键字
回复 寒枫天伤 - PSP 的问题
                IDataRow dataRow = newObject as IDataRow;
回复 寒枫天伤 - PSP 的问题                
if (dataRow != null)
{
回复 寒枫天伤 - PSP 的问题                    DataRowType t 
= dataRow.GetDataRowType();
回复 寒枫天伤 - PSP 的问题                    PropertyInfo pi 
= t.GetPrimaryKeyProperty();
回复 寒枫天伤 - PSP 的问题                    pi.SetValue(dataRow, Guid.NewGuid().ToString(
"N"), null);
回复 寒枫天伤 - PSP 的问题                }

回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题            
base.List.Add(newObject);
回复 寒枫天伤 - PSP 的问题            
return newObject;
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题        
#endregion
回复 寒枫天伤 - PSP 的问题


回复 寒枫天伤 - PSP 的问题        protected virtual void OnListChanged(ListChangedEventArgs e)
{
回复 寒枫天伤 - PSP 的问题            
if (this.ListChanged != null)
{
回复 寒枫天伤 - PSP 的问题                
this.ListChanged(this, e);
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题        
//内部引发ListChanged事件
回复 寒枫天伤 - PSP 的问题
        private void FireListChanged(ListChangedType listChangedType, int index)
{
回复 寒枫天伤 - PSP 的问题            
this.OnListChanged(new ListChangedEventArgs(listChangedType, index));
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题        
//内部引发ListChanged事件
回复 寒枫天伤 - PSP 的问题
        private void FireListChanged(ListChangedType listChangedType, int index,string propertyName)
{
回复 寒枫天伤 - PSP 的问题            PropertyDescriptor propDesc 
= TypeDescriptor.CreateProperty(GetCollectionItemType(), propertyName,typeof(string), null);
回复 寒枫天伤 - PSP 的问题            
this.OnListChanged(new ListChangedEventArgs(listChangedType, index,propDesc));
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        public bool RaiseItemChangedEvents
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return this.hookingItems;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题            
set
{
回复 寒枫天伤 - PSP 的问题                
if (this.hookingItems != value)
{
回复 寒枫天伤 - PSP 的问题                    
this.HookItems(false);
回复 寒枫天伤 - PSP 的问题                    
this.hookingItems = value;
回复 寒枫天伤 - PSP 的问题                    
this.HookItems(true);
回复 寒枫天伤 - PSP 的问题                }

回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        public void ResetBindings()
{
回复 寒枫天伤 - PSP 的问题            
this.FireListChanged(ListChangedType.Reset, -1);
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        public void ResetItem(int position)
{
回复 寒枫天伤 - PSP 的问题            
this.FireListChanged(ListChangedType.ItemChanged, position);
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题        
//拦截/取消元素
回复 寒枫天伤 - PSP 的问题
        private void HookItem(object item, bool hook)
{
回复 寒枫天伤 - PSP 的问题            
if (!this.hookingItems)
{
回复 寒枫天伤 - PSP 的问题                
return;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题            
if (this.onItemPropertyChanged == null)
{
回复 寒枫天伤 - PSP 的问题                
this.onItemPropertyChanged = new PropertyChangedEventHandler(this.OnItemPropertyChanged);
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题            IPropertyChange tmp 
= item as IPropertyChange;
回复 寒枫天伤 - PSP 的问题            
if (tmp != null)
{
回复 寒枫天伤 - PSP 的问题                
if (hook)
回复 寒枫天伤 - PSP 的问题                    tmp.PropertyChanged 
+= this.onItemPropertyChanged;
回复 寒枫天伤 - PSP 的问题                
else
回复 寒枫天伤 - PSP 的问题                    tmp.PropertyChanged 
-= this.onItemPropertyChanged;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题        
//拦截/取消指定索引的元素
回复 寒枫天伤 - PSP 的问题
        private void HookItemAt(int index, bool hook)
{
回复 寒枫天伤 - PSP 的问题            
if ((this.hookingItems && (index >= 0)) && (index < base.Count))
{
回复 寒枫天伤 - PSP 的问题                
this.HookItem(base.List[index], hook);
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题        
//拦截/取消所有元素
回复 寒枫天伤 - PSP 的问题
        private void HookItems(bool hook)
{
回复 寒枫天伤 - PSP 的问题            
if (!this.hookingItems)
回复 寒枫天伤 - PSP 的问题                
return;
回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题            IEnumerator e 
= base.GetEnumerator();
回复 寒枫天伤 - PSP 的问题            
while (e.MoveNext())
{
回复 寒枫天伤 - PSP 的问题                
object tmp = e.Current;
回复 寒枫天伤 - PSP 的问题                
this.HookItem(tmp, hook);
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题        
//在元素发生改变时调用
回复 寒枫天伤 - PSP 的问题
        private void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e)
{
回复 寒枫天伤 - PSP 的问题            
this.FireListChanged(ListChangedType.ItemChanged, base.List.IndexOf(sender), e.PropertyName);
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题        
#endregion
回复 寒枫天伤 - PSP 的问题


回复 寒枫天伤 - PSP 的问题        protected override void OnClear()
{
回复 寒枫天伤 - PSP 的问题            
this.EndNew(this.addNewPos);
回复 寒枫天伤 - PSP 的问题            
this.HookItems(false);
回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题            
//删除父对象关联,注意:这里不能会滚操作
回复 寒枫天伤 - PSP 的问题
            DataRowBase row;
回复 寒枫天伤 - PSP 的问题            
foreach (object item in InnerList)
{
回复 寒枫天伤 - PSP 的问题                row 
= item as DataRowBase;
回复 寒枫天伤 - PSP 的问题                
if (row != null)
回复 寒枫天伤 - PSP 的问题                    row.SetParent(
null);
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题            
base.OnClear();
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected override void OnClearComplete()
{
回复 寒枫天伤 - PSP 的问题            
base.OnClearComplete();
回复 寒枫天伤 - PSP 的问题            
this.FireListChanged(ListChangedType.Reset, -1);
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题        
#endregion
回复 寒枫天伤 - PSP 的问题


回复 寒枫天伤 - PSP 的问题        protected override void OnRemove(int index, object value)
{
回复 寒枫天伤 - PSP 的问题            
this.EndNew(this.addNewPos);
回复 寒枫天伤 - PSP 的问题            
this.HookItemAt(index, false);
回复 寒枫天伤 - PSP 的问题            
base.OnRemove(index, value);
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected override void OnRemoveComplete(int index, object value)
{
回复 寒枫天伤 - PSP 的问题            
//删除父对象关联
回复 寒枫天伤 - PSP 的问题
            DataRowBase row = value as DataRowBase;
回复 寒枫天伤 - PSP 的问题            
if (row != null)
回复 寒枫天伤 - PSP 的问题                row.SetParent(
null);
回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题            
base.OnRemoveComplete(index, value);
回复 寒枫天伤 - PSP 的问题            
this.FireListChanged(ListChangedType.ItemDeleted, index);
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题        
#endregion
回复 寒枫天伤 - PSP 的问题


回复 寒枫天伤 - PSP 的问题        protected override void OnSetComplete(int index, object oldValue, object newValue)
{
回复 寒枫天伤 - PSP 的问题            
//删除旧对象的父对象
回复 寒枫天伤 - PSP 的问题
            DataRowBase oldRow = oldValue as DataRowBase;
回复 寒枫天伤 - PSP 的问题            
if (oldRow != null)
回复 寒枫天伤 - PSP 的问题                oldRow.SetParent(
null);
回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题            
//设置新对象的父对象
回复 寒枫天伤 - PSP 的问题
            DataRowBase newRow = newValue as DataRowBase;
回复 寒枫天伤 - PSP 的问题            
if (newRow != null)
回复 寒枫天伤 - PSP 的问题                newRow.SetParent(_parent);
回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题            
base.OnSetComplete(index, oldValue, newValue);
回复 寒枫天伤 - PSP 的问题            
this.FireListChanged(ListChangedType.ItemChanged, index);
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题        
#endregion
回复 寒枫天伤 - PSP 的问题


回复 寒枫天伤 - PSP 的问题        public void CancelNew(int itemIndex)
{
回复 寒枫天伤 - PSP 的问题            
if ((this.addNewPos >= 0&& (this.addNewPos == itemIndex))
{
回复 寒枫天伤 - PSP 的问题                
this.RemoveAt(this.addNewPos);
回复 寒枫天伤 - PSP 的问题                
this.addNewPos = -1;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        public void EndNew(int itemIndex)
{
回复 寒枫天伤 - PSP 的问题            
if ((this.addNewPos >= 0&& (this.addNewPos == itemIndex))
{
回复 寒枫天伤 - PSP 的问题                
this.addNewPos = -1;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题
回复 寒枫天伤 - PSP 的问题        
#endregion
回复 寒枫天伤 - PSP 的问题


回复 寒枫天伤 - PSP 的问题        public bool AllowNew
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return ((IBindingList)this).AllowNew;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题            
set
{
回复 寒枫天伤 - PSP 的问题                
this.allowNew = value;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        bool IBindingList.AllowNew
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return this.AllowNewCore;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected virtual bool AllowNewCore
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return this.allowNew;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        public bool AllowEdit
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return ((IBindingList)this).AllowEdit;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题            
set
{
回复 寒枫天伤 - PSP 的问题                
this.allowEdit = value;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        bool IBindingList.AllowEdit
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return this.AllowEditCore;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected virtual bool AllowEditCore
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return this.allowEdit;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        public bool AllowRemove
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return ((IBindingList)this).AllowRemove;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题            
set
{
回复 寒枫天伤 - PSP 的问题                
this.allowRemove = value;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        bool IBindingList.AllowRemove
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return this.AllowRemoveCore;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected virtual bool AllowRemoveCore
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return this.allowRemove;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题        
#endregion
回复 寒枫天伤 - PSP 的问题


回复 寒枫天伤 - PSP 的问题        public bool SupportsChangeNotification
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return this.SupportsChangeNotificationCore;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected virtual bool SupportsChangeNotificationCore
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return true;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        public bool SupportsSearching
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return this.SupportsSearchingCore;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected virtual bool SupportsSearchingCore
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return false;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        public bool SupportsSorting
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return this.SupportsSortingCore;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected virtual bool SupportsSortingCore
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return false;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        public bool IsSorted
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return this.IsSortedCore;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected virtual bool IsSortedCore
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return false;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        public PropertyDescriptor SortProperty
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return this.SortPropertyCore;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected virtual PropertyDescriptor SortPropertyCore
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return null;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        public ListSortDirection SortDirection
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return this.SortDirectionCore;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected virtual ListSortDirection SortDirectionCore
{
回复 寒枫天伤 - PSP 的问题            
get
{
回复 寒枫天伤 - PSP 的问题                
return ListSortDirection.Ascending;
回复 寒枫天伤 - PSP 的问题            }

回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        public void ApplySort(PropertyDescriptor property, ListSortDirection direction)
{
回复 寒枫天伤 - PSP 的问题            
this.ApplySortCore(property, direction);
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected virtual void ApplySortCore(PropertyDescriptor property, ListSortDirection direction)
{
回复 寒枫天伤 - PSP 的问题            
throw new NotSupportedException();
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        public void RemoveSort()
{
回复 寒枫天伤 - PSP 的问题            
this.RemoveSortCore();
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected virtual void RemoveSortCore()
{
回复 寒枫天伤 - PSP 的问题            
throw new NotSupportedException();
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        public int Find(PropertyDescriptor property, object key)
{
回复 寒枫天伤 - PSP 的问题            
return this.FindCore(property, key);
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        protected virtual int FindCore(PropertyDescriptor property, object key)
{
回复 寒枫天伤 - PSP 的问题            
throw new NotSupportedException();
回复 寒枫天伤 - PSP 的问题        }

回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        void IBindingList.AddIndex(PropertyDescriptor property)
{
回复 寒枫天伤 - PSP 的问题            
//
回复 寒枫天伤 - PSP 的问题
        }
回复 寒枫天伤 - PSP 的问题

回复 寒枫天伤 - PSP 的问题        void IBindingList.RemoveIndex(PropertyDescriptor property)
{
回复 寒枫天伤 - PSP 的问题            
//
回复 寒枫天伤 - PSP 的问题
        }
回复 寒枫天伤 - PSP 的问题        
#endregion
回复 寒枫天伤 - PSP 的问题    }

回复 寒枫天伤 - PSP 的问题}

回复 寒枫天伤 - PSP 的问题

相关文章:

  • 2022-12-23
  • 2021-12-20
  • 2022-12-23
  • 2021-08-13
  • 2021-06-14
  • 2021-07-21
  • 2021-10-30
  • 2021-06-04
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-11-21
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-04
相关资源
相似解决方案