有数据绑定、排序、查找功能的ListView(二):ListViewEx

using System;
using System.Data;
using System.Text;
using System.Globalization;
using System.Collections;
using System.Reflection;

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Design;

using System.Windows.Forms;
using System.Windows.Forms.Design;

using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;

using System.Runtime.InteropServices;

namespace CommonFrame.OCX
{
///

1<summary>   
2/// 为ListView增加数据绑定、查找和排序功能   
3/// </summary>

///

#region 枚举
public enum SortType
{
String,
Number,
Date
}
#endregion

#region 继承实现ListView列表类
public class ListViewEx : System.Windows.Forms.ListView
{

#region 列表项目所需的WIndows32 API定义

[StructLayout(LayoutKind.Sequential)]
private struct HDITEM
{
public Int32 mask;
public Int32 cxy;
[MarshalAs(UnmanagedType.LPTStr)]
public String pszText;
public IntPtr hbm;
public Int32 cchTextMax;
public Int32 fmt;
public Int32 lParam;
public Int32 iImage;
public Int32 iOrder;
};

[StructLayout(LayoutKind.Sequential) ]
public struct LVFINDINFO
{
public LVFI_FLAGS flags;
public string psz;
public IntPtr lParam;
public Point pt;
public VirtualKey vkDirection ;
}

public enum LVFI_FLAGS
{
LVFI_PARAM = 0x1,
LVFI_PARTIAL = 0x8,
LVFI_STRING = 0x2,
LVFI_WRAP = 0x20,
LVFI_NEARESTXY = 0x40,
}

public enum VirtualKey
{
VK_LEFT = 0x25,
VK_RIGHT = 0x27,
VK_UP = 0x26,
VK_DOWN = 0x28,
VK_HOME = 0x24,
VK_END = 0x23,
VK_PRIOR = 0x21,
VK_NEXT = 0x22
}

[DllImport("user32")]
static extern IntPtr SendMessage(IntPtr Handle, Int32 msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32", EntryPoint="SendMessage")]
static extern IntPtr SendMessageH(IntPtr Handle, Int32 msg, IntPtr wParam, ref HDITEM lParam);
[DllImport("user32.dll", EntryPoint="SendMessage", CharSet=CharSet.Auto)]
static extern int SendMessageL(System.IntPtr hWnd, Int32 msg, int wParam, ref LVFINDINFO lparam);

const Int32 HDI_WIDTH = 0x0001;
const Int32 HDI_HEIGHT = HDI_WIDTH;
const Int32 HDI_TEXT = 0x0002;
const Int32 HDI_FORMAT = 0x0004;
const Int32 HDI_LPARAM = 0x0008;
const Int32 HDI_BITMAP = 0x0010;
const Int32 HDI_IMAGE = 0x0020;
const Int32 HDI_DI_SETITEM = 0x0040;
const Int32 HDI_ORDER = 0x0080;
const Int32 HDI_FILTER = 0x0100; // 0x0500

const Int32 HDF_LEFT = 0x0000;
const Int32 HDF_RIGHT = 0x0001;
const Int32 HDF_CENTER = 0x0002;
const Int32 HDF_JUSTIFYMASK = 0x0003;
const Int32 HDF_RTLREADING = 0x0004;
const Int32 HDF_OWNERDRAW = 0x8000;
const Int32 HDF_STRING = 0x4000;
const Int32 HDF_BITMAP = 0x2000;
const Int32 HDF_BITMAP_ON_RIGHT = 0x1000;
const Int32 HDF_IMAGE = 0x0800;
const Int32 HDF_SORTUP = 0x0400; // 0x0501
const Int32 HDF_SORTDOWN = 0x0200; // 0x0501

const Int32 LVM_FIRST = 0x1000; // List 消息
const Int32 LVM_FINDITEMA = LVM_FIRST + 13;
const Int32 LVM_FINDITEMW = LVM_FIRST + 83;
const Int32 LVM_GETHEADER = LVM_FIRST + 31;

const Int32 HDM_FIRST = 0x1200; // Header 消息
const Int32 HDM_SETIMAGELIST = HDM_FIRST + 8;
const Int32 HDM_GETIMAGELIST = HDM_FIRST + 9;
const Int32 HDM_GETITEM = HDM_FIRST + 11;
const Int32 HDM_SETITEM = HDM_FIRST + 12;

#endregion

private string m_strDataFilter = "";
private int m_intSortColumn = -1;
private string m_strDataMember = "";
private CurrencyManager m_objDataManager = null;
private DataSet m_objData = null;
private DataView m_objView = null;

internal bool m_blnModifiedItem = true;

private CommonFrame.OCX.ListViewItemsCollection m_objItems ;
private CommonFrame.OCX.ColumnHeaderMappingCollection m_objMappings ;

public ListViewEx()
{
m_objItems = new CommonFrame.OCX.ListViewItemsCollection(this);
m_objMappings = new CommonFrame.OCX.ColumnHeaderMappingCollection();
}

#region 属性

[
CategoryAttribute("Data"),
BrowsableAttribute(true),
DescriptionAttribute("设置的数据成员"),
DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible),
DefaultValueAttribute("")
]
public string DataMember
{
get
{
return m_strDataMember;
}
set
{
m_strDataMember = value;
//this.SetDataMember();
}
}

[
CategoryAttribute("Data"),
BrowsableAttribute(true),
DescriptionAttribute("设置数据源"),
DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible),
DefaultValueAttribute(null)
]
public DataSet DataSource
{
get
{
return m_objData;
}
set
{
m_objData = value;
this.SetDataSource();
}
}

[
BrowsableAttribute(false),
DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)
]
public string DataFilter
{
get
{
return m_strDataFilter;
}
set
{
if (this.m_objData != null)
{
m_strDataFilter = value;
this.SetDataFilter();
}
else
{
m_strDataFilter = "";
}
}
}

[
CategoryAttribute("杂项"),
BrowsableAttribute(true),
DescriptionAttribute("列表项集合"),
DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Content),
DefaultValueAttribute(null)
]
public CommonFrame.OCX.ListViewItemsCollection Items
{
get
{
return m_objItems;
}
}

[
CategoryAttribute("杂项"),
BrowsableAttribute(true),
DescriptionAttribute("列表标头与数据成员映射集合"),
DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Content),
DefaultValueAttribute(null)
]
public CommonFrame.OCX.ColumnHeaderMappingCollection ColumnHeaderMappings
{
get
{
return m_objMappings;
}
set
{
m_objMappings = value;
}
}

public bool MultiSelect
{
get
{
return base.MultiSelect;
}
set
{
base.MultiSelect = value;
if ((this.DataSource != null) && (base.MultiSelect == true))
{
base.MultiSelect = false;
throw new Exception("已经设置了数据源DataSource,不能多选");
}
}
}

#endregion

#region 方法

// 填充数据
private void FillListViewItems()
{
ListViewItem item = null;
int intRowCount = this.m_objDataManager.Count ;

this.BeginUpdate();

//允许修改列表项目
this.m_blnModifiedItem = true;
//清除已经有的列表项目
if(this.Items.Count>0)
{
this.Items.Clear();
}

for(int i=0;i

  1<introwcount;i++) !="null)" "="" #endregion="" #region="" &&="" (="" ((m_objdata="null)" ((this.focuseditem="" ((this.parent!="null)" (e);="" (includesubitemsinsearch="false)" (intitemindex="" (intsubitemindex="" (itemtext="objItem.SubItems[intSubItemIndex].Text)" (listview.items.count="0)" (listview.items[i].text="itemText)" (m_objdata="" (m_objdatamanager="null)" (m_strdatamember="" (objdc="" (this.items.count="" (this.parent.bindingcontext="" (this.sorting="SortOrder.Descending)" ))="" +="" ;="" <="" base.onbindingcontextchanged="" base.oncolumnclick="" base.onselectedindexchanged="" ch="this.Columns.Add(objDC[i].ColumnName.Trim(),60,HorizontalAlignment.Left);" columnheader="" datacolumncollection="" datasource_positionchanged(object="" e)="" else="" eventhandler(datasource_positionchanged);="" finditem(listview="" for(="" for(int="" i="0;i&lt;listView.Items.Count;i++)" if="" if(e.column="m_intSortColumn)" includesubitemsinsearch)="" int="" intitemindex="" intsubitemindex="" item="new" item.subitems.add(m_objview[i][this.m_objmappings[j].mappingfield].tostring());="" itemchangedeventhandler(datasource_itemchanged);="" itemtext,bool="" j="1;j&lt;this.m_objMappings.Count;j++)" listview,string="" listview.items.count)="" listview.items[i].ensurevisible();="" listview.items[i].selected="true;" listview.items[i];="" listviewitem="" listviewitem(m_objview[i][this.m_objmappings[0].mappingfield].tostring());="" listviewitemcomparer(m_intsortcolumn,this.sorting,this.m_objmappings[m_intsortcolumn].sorttype);="" m_intsortcolumn="e.Column;" m_objdatamanager="(CurrencyManager)this.Parent.BindingContext[m_objData,m_strDataMember];" m_objdatamanager.itemchanged="" m_objdatamanager.position="(int)this.FocusedItem.Index" m_objdatamanager.positionchanged="" m_objview.rowfilter="this.DataFilter;" m_objview.sort="this.m_objMappings[m_intSortColumn].MappingField" null;="" objdc="m_objData.Tables[m_strDataMember].Columns;" objitem="listView.Items[intItemIndex];" objitem.ensurevisible();="" objitem.selected="true;" objitem.subitems.count)="" objitem;="" onbindingcontextchanged(eventargs="" oncolumnclick(columnclickeventargs="" onselectedindexchanged(eventargs="" override="" private="" protected="" public="" return="" return;="" sender,eventargs="" setdatafilter()="" setdatamember()="" setdatasource()="" string="" strorder="Desc" strorder;="" this.columnheadermappings.clear();="" this.columns.clear();="" this.datafilter="" this.endupdate();="" this.items.add(item);="" this.items.clear();="" this.listviewitemsorter="new" this.m_blnmodifieditem="false;" this.m_objmappings.add(ch,objdc[i].columnname.trim());="" this.m_objview="(DataView)m_objDataManager.List;" this.multiselect="false;" this.sort();="" this.sorting="SortOrder.Ascending)" void="" while="" {="" ||="" ||(m_strdatamember="" }="" 事件="" 在选择列表项后,同步其他数据绑定的控件="" 对于没有进行数据绑定时,使用listview本身的排序功能="" 对于进行数据绑定时的排序,使用dataview的排序功能="" 当其他的数据绑定控件修改当前选项时,listview同步="" 排序="" 查找项目="" 清空列表项目="" 获取currencymanager,以实现同其他数据绑定控件的同步="" 设置多选属性为单选=""> 0 )   
  2{   
  3this.Items[m_objDataManager.Position].Selected = true;   
  4this.Items[m_objDataManager.Position].EnsureVisible();   
  5}   
  6} 
  7
  8//当数据源DataSet有内容时,自动填充ListView   
  9private void DataSource_ItemChanged(object sender ,ItemChangedEventArgs e)   
 10{   
 11if (this.DesignMode == false)   
 12{   
 13FillListViewItems(); 
 14
 15}   
 16}   
 17#endregion   
 18} 
 19
 20#endregion   
 21#region 排序管理类 
 22
 23public class ListViewItemComparer : System.Collections.IComparer   
 24{   
 25private int m_intColumn = 0;   
 26private SortType m_enmSortType = SortType.String;   
 27private SortOrder m_enmSortOrder = SortOrder.Ascending ; 
 28
 29public ListViewItemComparer (int columnIndex,SortOrder sortOrder)   
 30{   
 31m_intColumn = columnIndex;   
 32m_enmSortOrder = sortOrder;   
 33} 
 34
 35public ListViewItemComparer (int columnIndex,SortOrder sortOrder,SortType sortType)   
 36{   
 37m_intColumn = columnIndex;   
 38m_enmSortType = sortType;   
 39m_enmSortOrder = sortOrder;   
 40} 
 41
 42int IComparer.Compare(object x, object y)   
 43{   
 44int intSort = 0; 
 45
 46if(m_enmSortType == SortType.String) //字符排序   
 47{   
 48intSort = String.Compare(((ListViewItem)x).SubItems[m_intColumn].Text.Trim(),   
 49((ListViewItem)y).SubItems[m_intColumn].Text.Trim()   
 50);   
 51}   
 52else if (m_enmSortType == SortType.Number) //数值排序   
 53{   
 54try   
 55{   
 56System.Double firstNumber =   
 57Double.Parse(((ListViewItem)x).SubItems[m_intColumn].Text);   
 58System.Double secondNumber =   
 59Double.Parse(((ListViewItem)y).SubItems[m_intColumn].Text);   
 60if (firstNumber &gt; secondNumber)   
 61{   
 62intSort = 1;   
 63}   
 64else if (firstNumber &lt; secondNumber)   
 65{   
 66intSort = -1;   
 67}   
 68else   
 69{   
 70intSort = 0;   
 71}   
 72}   
 73catch   
 74{   
 75intSort = String.Compare(((ListViewItem)x).SubItems[m_intColumn].Text,   
 76((ListViewItem)y).SubItems[m_intColumn].Text);   
 77}   
 78}   
 79else if (m_enmSortType == SortType.Date) //日期排序   
 80{   
 81try   
 82{   
 83System.DateTime firstDate =   
 84DateTime.Parse(((ListViewItem)x).SubItems[m_intColumn].Text);   
 85System.DateTime secondDate =   
 86DateTime.Parse(((ListViewItem)y).SubItems[m_intColumn].Text);   
 87intSort = DateTime.Compare(firstDate, secondDate);   
 88}   
 89catch   
 90{   
 91intSort = String.Compare(((ListViewItem)x).SubItems[m_intColumn].Text,   
 92((ListViewItem)y).SubItems[m_intColumn].Text);   
 93}   
 94} 
 95
 96if(m_enmSortOrder == SortOrder.Descending)   
 97{   
 98return intSort*= -1;   
 99}   
100else   
101{   
102return intSort;   
103}   
104}   
105} 
106
107#endregion 
108
109#region 继承列表项目集合类。当设定DataSource属性时,不允许增加、插入、删除列表项目 
110
111public class ListViewItemsCollection : ListView.ListViewItemCollection   
112{   
113private CommonFrame.OCX.ListViewEx m_lvwBase = null; 
114
115public ListViewItemsCollection(CommonFrame.OCX.ListViewEx listView):base(listView)   
116{   
117m_lvwBase = listView;   
118} 
119
120public int Count   
121{   
122get   
123{   
124return base.Count;   
125}   
126} 
127
128public ListViewItem this[int index]   
129{   
130get   
131{   
132return base[index];   
133}   
134} 
135
136public int IndexOf(ListViewItem item)   
137{   
138return base.IndexOf(item);   
139} 
140
141public void Remove(System.Windows.Forms.ListViewItem item)   
142{   
143if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
144{   
145throw new Exception("已经设置了DataSource,不允许删除项目");   
146}   
147else   
148{   
149base.Remove(item);   
150}   
151} 
152
153public void RemoveAt(int index)   
154{   
155if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
156{   
157throw new Exception("已经设置了DataSource,不允许删除项目");   
158}   
159else   
160{   
161base.RemoveAt(index);   
162}   
163} 
164
165public System.Windows.Forms.ListViewItem Add(string text)   
166{   
167if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
168{   
169throw new Exception("已经设置了DataSource,不允许添加项目");   
170}   
171else   
172{   
173return base.Add(text);   
174}   
175}   
176  
177public System.Windows.Forms.ListViewItem Add(string text,int imageIndex)   
178{   
179if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
180{   
181throw new Exception("已经设置了DataSource,不允许添加项目");   
182}   
183else   
184{   
185return base.Add(text,imageIndex);   
186}   
187} 
188
189public void Insert(int index,System.Windows.Forms.ListViewItem item)   
190{   
191if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
192{   
193throw new Exception("已经设置了DataSource,不允许添加项目");   
194}   
195else   
196{   
197base.Insert(index,item);   
198}   
199} 
200
201public void Insert(int index,string text)   
202{   
203if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
204{   
205throw new Exception("已经设置了DataSource,不允许添加项目");   
206}   
207else   
208{   
209base.Insert(index,text);   
210}   
211} 
212
213public void Insert(int index,string text,int imageIndex)   
214{   
215if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
216{   
217throw new Exception("已经设置了DataSource,不允许添加项目");   
218}   
219else   
220{   
221base.Insert(index,text,imageIndex);   
222}   
223} 
224
225public void AddRange(System.Windows.Forms.ListViewItem[] values)   
226{   
227if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
228{   
229throw new Exception("已经设置了DataSource,不允许添加项目");   
230}   
231else   
232{   
233base.AddRange(values);   
234}   
235} 
236
237public void Clear()   
238{   
239if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
240{   
241throw new Exception("已经设置了DataSource,不允许清空项目");   
242}   
243else   
244{   
245base.Clear();   
246}   
247}   
248} 
249
250#endregion 
251
252#region 列标头映射集合类,实现IList接口,对ColumnHeaderMapping类进行管理 
253
254public class ColumnHeaderMappingCollection : System.Collections.IList   
255{   
256private ArrayList m_arrColumnHearderMapping = new ArrayList(15); 
257
258public ColumnHeaderMappingCollection()   
259{   
260}   
261  
262#region 实现IList接口 
263
264int IList.Add(object value)   
265{   
266return m_arrColumnHearderMapping.Add(value);   
267} 
268
269void IList.Clear()   
270{   
271m_arrColumnHearderMapping.Clear();   
272} 
273
274bool IList.Contains(object item)   
275{   
276return m_arrColumnHearderMapping.Contains(item);   
277} 
278
279int IList.IndexOf(object value)   
280{   
281return m_arrColumnHearderMapping.IndexOf(value);   
282} 
283
284void IList.Insert(int index,object value)   
285{   
286m_arrColumnHearderMapping.Insert(index,value);   
287} 
288
289bool IList.IsFixedSize   
290{   
291get   
292{   
293return m_arrColumnHearderMapping.IsFixedSize;   
294}   
295} 
296
297bool IList.IsReadOnly   
298{   
299get   
300{   
301return m_arrColumnHearderMapping.IsReadOnly;   
302}   
303} 
304
305void IList.Remove(object obj)   
306{   
307m_arrColumnHearderMapping.Remove(obj);   
308} 
309
310void IList.RemoveAt(int index)   
311{   
312m_arrColumnHearderMapping.RemoveAt(index);   
313} 
314
315object IList.this[int index]   
316{   
317get   
318{   
319return m_arrColumnHearderMapping[index];   
320}   
321set   
322{   
323}   
324} 
325
326bool System.Collections.ICollection.IsSynchronized   
327{   
328get   
329{   
330return m_arrColumnHearderMapping.IsSynchronized;   
331}   
332} 
333
334object System.Collections.ICollection.SyncRoot   
335{   
336get   
337{   
338return m_arrColumnHearderMapping.SyncRoot;   
339}   
340} 
341
342void System.Collections.ICollection.CopyTo(System.Array array,int arrayIndex)   
343{   
344m_arrColumnHearderMapping.CopyTo(array,arrayIndex);   
345} 
346
347#endregion 
348
349public int Count   
350{   
351get   
352{   
353return m_arrColumnHearderMapping.Count;   
354}   
355} 
356
357public ColumnHeaderMapping this[int index]   
358{   
359get   
360{   
361return (ColumnHeaderMapping)m_arrColumnHearderMapping[index];   
362}   
363} 
364
365public void Add(ColumnHeader columnHeader,string mappingField)   
366{   
367m_arrColumnHearderMapping.Add(new ColumnHeaderMapping(columnHeader,mappingField));   
368} 
369
370public void Add(ColumnHeaderMapping ColumnHeaderMapping)   
371{   
372m_arrColumnHearderMapping.Add(ColumnHeaderMapping);   
373} 
374
375public void AddRange(ColumnHeaderMapping[] columnHeadMappings)   
376{   
377m_arrColumnHearderMapping.AddRange(columnHeadMappings);   
378} 
379
380public void AddRange(ColumnHeader[] columnHeaders,string[] mappingFields)   
381{   
382if (columnHeaders.Length != mappingFields.Length)   
383{   
384return;   
385}   
386for(int i=0;i&lt;mappingFields.Length;i++)   
387{   
388m_arrColumnHearderMapping.Add(new ColumnHeaderMapping(columnHeaders[i],mappingFields[i]));   
389}   
390} 
391
392public void Remove(ColumnHeaderMapping ColumnHeaderMapping)   
393{   
394m_arrColumnHearderMapping.Remove(ColumnHeaderMapping);   
395} 
396
397public void Clear()   
398{   
399m_arrColumnHearderMapping.Clear();   
400} 
401
402public int IndexOf(ColumnHeaderMapping columnHeaderMapping)   
403{   
404return m_arrColumnHearderMapping.IndexOf(columnHeaderMapping);   
405} 
406
407public void Insert(int index,ColumnHeaderMapping columnHeaderMapping)   
408{   
409m_arrColumnHearderMapping.Insert(index,columnHeaderMapping);   
410}   
411  
412public void InsertRange(int index,ColumnHeaderMapping[] columnHeaderMappings)   
413{   
414m_arrColumnHearderMapping.InsertRange(index,columnHeaderMappings);   
415} 
416
417public bool Contains(ColumnHeaderMapping columnHeader)   
418{   
419return m_arrColumnHearderMapping.Contains(columnHeader);   
420} 
421
422public System.Collections.IEnumerator GetEnumerator()   
423{   
424return m_arrColumnHearderMapping.GetEnumerator();   
425}   
426}   
427#endregion 
428
429#region 列表标头映射类,实现列表标头同数据库表字段的映射,定义列表标头在排序时使用的数据类型 
430
431[TypeConverterAttribute(typeof(ColumnHeaderMappingConvert))]   
432public class ColumnHeaderMapping   
433{   
434private ColumnHeader m_objColumnHeader;   
435private string m_strMappingField;   
436private SortType m_enmSortType; 
437
438public ColumnHeaderMapping()   
439{   
440m_objColumnHeader = new ColumnHeader();   
441m_strMappingField = "";   
442} 
443
444public ColumnHeaderMapping(ColumnHeader columnHeader,string mappingField)   
445{   
446m_objColumnHeader = columnHeader;   
447m_strMappingField = mappingField;   
448} 
449
450[   
451CategoryAttribute("杂项"),   
452BrowsableAttribute(true),   
453DescriptionAttribute("列表标头"),   
454DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Content),   
455DefaultValueAttribute(null)   
456]   
457public ColumnHeader ColumnHeader   
458{   
459get   
460{   
461return m_objColumnHeader;   
462}   
463set   
464{   
465m_objColumnHeader = value;   
466}   
467} 
468
469[   
470CategoryAttribute("杂项"),   
471BrowsableAttribute(true),   
472DescriptionAttribute("映射字段"),   
473DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible),   
474DefaultValueAttribute("")   
475]   
476public string MappingField   
477{   
478get   
479{   
480return m_strMappingField;   
481}   
482set   
483{   
484m_strMappingField = value;   
485}   
486} 
487
488[   
489CategoryAttribute("杂项"),   
490BrowsableAttribute(true),   
491DescriptionAttribute("列表标头类型"),   
492DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible),   
493DefaultValueAttribute(SortType.String)   
494]   
495public SortType SortType   
496{   
497get   
498{   
499return m_enmSortType;   
500}   
501set   
502{   
503m_enmSortType = value;   
504}   
505}   
506}   
507#endregion 
508
509#region 对ColumnHeaderMapping进行转换,实现ColumnHeaderMapping类在IDE中的序列化 
510
511public class ColumnHeaderMappingConvert : TypeConverter   
512{   
513public ColumnHeaderMappingConvert()   
514{   
515} 
516
517public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)   
518{   
519if (destinationType == typeof(InstanceDescriptor))   
520{   
521return true;   
522} 
523
524return base.CanConvertTo(context, destinationType);   
525} 
526
527public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)   
528{   
529if (value is ColumnHeaderMapping)   
530{   
531if (destinationType == typeof(InstanceDescriptor))   
532{   
533object[] properites = new object[2];   
534Type[] types = new Type[2]; 
535
536ColumnHeaderMapping chm = (ColumnHeaderMapping)value; 
537
538types[0] = typeof(ColumnHeader);   
539properites[0] = chm.ColumnHeader ; 
540
541types[1] = typeof(string);   
542properites[1] = chm.MappingField ; 
543
544ConstructorInfo ci = typeof(ColumnHeaderMapping).GetConstructor(types);   
545return new InstanceDescriptor(ci,properites);   
546}   
547}   
548return base.ConvertTo(context, culture, value, destinationType);   
549}   
550}   
551#endregion 
552
553#region 继承列表标头集合类(由于继承列表标头集合类后,新增的列表标头不能显示在列表中,所以已经注释,暂时没有使用)   
554// public class ColumnHeaderCollection : ListView.ColumnHeaderCollection   
555// {   
556// private ListView m_lvwBase = null;   
557//   
558// public ColumnHeaderCollection(CommonFrame.OCX.ListView listView) : base(listView)   
559// {   
560// m_lvwBase = listView;   
561// }   
562//   
563// public void Remove(ColumnHeader item)   
564// {   
565// if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
566// {   
567// throw new Exception("已经设置了DataSource,不允许删除项目");   
568// }   
569// else   
570// {   
571// base.Remove(item);   
572// }   
573// }   
574//   
575// public void RemoveAt(int index)   
576// {   
577// if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
578// {   
579// throw new Exception("已经设置了DataSource,不允许删除项目");   
580// }   
581// else   
582// {   
583// base.RemoveAt(index);   
584//   
585// }   
586// }   
587//   
588// public int Add(ColumnHeader value)   
589// {   
590// if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
591// {   
592// throw new Exception("已经设置了DataSource,不允许添加项目");   
593// }   
594// else   
595// {   
596// return base.Add(value);   
597// }   
598// }   
599//   
600// public ColumnHeader Add(string text,int width,HorizontalAlignment textAlign)   
601// {   
602// if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
603// {   
604// throw new Exception("已经设置了DataSource,不允许添加项目");   
605// }   
606// else   
607// {   
608// return base.Add(text,width,textAlign);   
609// }   
610// }   
611//   
612// public void Insert(int index,ColumnHeader item)   
613// {   
614// if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
615// {   
616// throw new Exception("已经设置了DataSource,不允许添加项目");   
617// }   
618// else   
619// {   
620// base.Insert(index,item);   
621// }   
622// }   
623//   
624// public void Insert(int index,string text,int width,HorizontalAlignment textAlign)   
625// {   
626// if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
627// {   
628// throw new Exception("已经设置了DataSource,不允许添加项目");   
629// }   
630// else   
631// {   
632// base.Insert(index,text,width,textAlign);   
633// }   
634// }   
635//   
636// public void AddRange(ColumnHeader[] values)   
637// {   
638// if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
639// {   
640// throw new Exception("已经设置了DataSource,不允许添加项目");   
641// }   
642// else   
643// {   
644// base.AddRange(values);   
645// }   
646// }   
647//   
648// public void Clear()   
649// {   
650// if ((m_lvwBase.DataSource != null) &amp;&amp; (m_lvwBase.m_blnModifiedItem == false))   
651// {   
652// throw new Exception("已经设置了DataSource,不允许清空项目");   
653// }   
654// else   
655// {   
656// base.Clear();   
657// }   
658// }   
659//   
660// public ColumnHeader this[int index]   
661// {   
662// get   
663// {   
664// return base[index];   
665// }   
666// }   
667// }   
668#endregion   
669}</introwcount;i++)>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus