????? 博客開通有一陣了,就是沒有時間寫,遺憾啊。!
??????這幾天做了個排序的自定義控件,在listbox item里放是button 并支持圖標的交替變換
效果如下:
把代碼貼上:
- ??1using?System; ?
- ??2using?System.Collections.Generic; ?
- ??3using?System.Collections; ?
- ??4using?System.Text; ?
- ??5using?System.ComponentModel; ?
- ??6using?System.Windows.Forms; ?
- ??7using?System.Drawing; ?
- ??8using?System.Drawing.Text; ?
- ??9using?System.Data; ?
- ?
- namespace?SQLAnalysis ?
- { ?
- ????public?class?ListBoxEx?:?ListBox ?
- ????{ ?
- ????????public?ListBoxEx() ?
- ????????{ ?
- ????????????this.DrawMode?=?DrawMode.OwnerDrawFixed; ?
- ????????????btnList?=?new?List<Button>(); ?
- ????????} ?
- ????????public?override?DrawMode?DrawMode ?
- ????????{ ?
- ????????????get ?
- ????????????{ ?
- ????????????????return?DrawMode.OwnerDrawFixed; ?
- ????????????} ?
- ????????????set ?
- ????????????{ ?
- ????????????????base.DrawMode?=?DrawMode.OwnerDrawFixed; ?
- ????????????} ?
- ????????} ?
- ??????? ?
- ????????protected?override?void?OnResize(EventArgs?e) ?
- ????????{ ?
- ????????????base.OnResize(e); ?
- ????????????this.Refresh(); ?
- ????????} ?
- ?
- ?
- ?
- ?
- ????????public?Button?FindItemButton(int?index) ?
- ????????{ ?
- ???????????? ?
- ????????//?return?this.Controls.Find(this.Name?+?"$ItemComboBox"?+?index.ToString(),?true)[0]; ?
- ????????????if?(index?>=?btnList.Count) ?
- ????????????????return?null; ?
- ????????????return?btnList[index]; ?
- ??????????? ?
- ????????} ?
- ?
- ????????///?<summary>?
- ????????///?提供刪除item項 ?
- ????????///?</summary>?
- ????????///?<param?name="index"></param>?
- ????????public?void?RemoveItem(int?index) ?
- ????????{ ?
- ????????????this.Items.RemoveAt(index); ?
- ????????????btnList[index].Parent?=?null; ?
- ????????????btnList[index]?=?null; ?
- ????????????//btnList[index].Dispose(); ?
- ???????????? ?
- ????????????btnList.RemoveAt(index); ?
- ????????????this.Refresh(); ?
- ????????} ?
- ????????///?<summary>?
- ????????///?提供移動item項 ?
- ????????///?</summary>?
- ????????///?<param?name="offset"></param>?
- ????????public?void?MoveItem(int?offset) ?
- ????????{ ?
- ???????????? ?
- ????????????int?index?=?this.SelectedIndex?+?offset; ?
- ????????????if?(index?>?-1?&&?index?<?this.Items.Count) ?
- ????????????{ ?
- ????????????????int?oldSelectedIndex?=?this.SelectedIndex; ?
- ????????????????Object?item?=?this.SelectedItem; ?
- ????????????????this.Items.RemoveAt(oldSelectedIndex); ?
- ????????????????this.Items.Insert(index,?item); ?
- ????????????????Button?btn?=?btnList[oldSelectedIndex]; ?
- ????????????????btnList.RemoveAt(oldSelectedIndex); ?
- ????????????????btnList.Insert(index,?btn); ?
- ?
- ????????????????this.Refresh(); ?
- ????????????} ?
- ????????????else ?
- ????????????{ ?
- ????????????????MessageBox.Show("不是可用的移動矢量"); ?
- ?
- ????????????} ?
- ?
- ????????} ?
- ?
- ????????private?ToggleItem?GetNexttoggleItem(ToggleItem?tog) ?
- ????????{ ?
- ????????????int?index?=?-1; ?
- ????????????for?(int?i?=?0;?i?<?ToggleItemList.Count;?i++) ?
- ????????????{ ?
- ????????????????ToggleItem?item?=(ToggleItem)ToggleItemList[i]; ?
- ????????????????if?(item.Tag?==?tog.Tag) ?
- ????????????????{ ?
- ????????????????????iindex?=?i; ?
- ????????????????????break; ?
- ????????????????} ?
- ????????????} ?
- ????????????return?((ToggleItem)ToggleItemList[(index?+?1)?%?ToggleItemList.Count]); ?
- ????????} ?
- ????????private?List<ToggleItem>?toggleItemList?;//List<ToggleItem>?toggleItemList?=?new?List<ToggleItem>(); ?
- ????????[Bindable(false),?Browsable(false)] ?
- ????????[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]??? ?
- ????????public?List<ToggleItem>?ToggleItemList ?
- ????????{ ?
- ????????????get ?
- ????????????{ ?
- ????????????????if?(toggleItemList?==?null) ?
- ????????????????????toggleItemList?=?new?List<ToggleItem>(); ?
- ????????????????return?toggleItemList; ?
- ????????????} ?
- ?
- ????????????set ?
- ????????????{ ?
- ????????????????if?(toggleItemList?==?null) ?
- ????????????????????toggleItemList?=?new?List<ToggleItem>(); ?
- ????????????????toggleItemList?=?value; ?
- ????????????} ?
- ????????} ?
- ?
- ????????//主要重寫事件 ?
- ????????protected?override?void?OnDrawItem(DrawItemEventArgs?e) ?
- ????????{ ?
- ????????????this.DrawMode?=?DrawMode.OwnerDrawFixed; ?
- ????????????this.ItemHeight?=?22; ?
- ????????????e.DrawBackground(); ?
- ????????????e.DrawFocusRectangle(); ?
- ????????????Brush?myBrush?=?Brushes.Black; ?
- ????????????if?(e.Index?>?-1?&&?e.Index?<?this.Items.Count) ?
- ????????????{ ?
- ????????????????string?drawString?=?(e.Index?+?1)+?"?"?+?this.Items[e.Index].ToString(); ?
- ???????????????? ?
- ?
- ????????????????e.Graphics.DrawString(drawString,?e.Font,?new?SolidBrush(e.ForeColor),?e.Bounds,? ?
- ?
- StringFormat.GenericDefault); ?
- ????????????????AddButtonToItem(e); ?
- ????????????} ?
- ????????????base.OnDrawItem(e); ?
- ?
- ????????} ?
- ?
- ????????private?List<Button>?btnList?=?null; ?
- ????????protected?void?AddButtonToItem(DrawItemEventArgs?e) ?
- ????????{ ?
- ????????????if?(btnList.Count?<=?e.Index) ?
- ????????????{ ?
- ????????????????btnList.Add(new?Button()); ?
- ????????????????Button?btn?=?btnList[e.Index]; ?
- ????????????????btn.BackColor?=?System.Drawing.Color.LightSkyBlue?; ?
- ????????????????btn.Name?=?this.Name?+?"$ItemButton"?+?e.Index.ToString(); ?
- ????????????????btn.Width?=?20; ?
- ????????????????btn.Height?=?20; ?
- ????????????????btn.ImageAlign?=?ContentAlignment.MiddleCenter; ?
- ????????????????btn.TextImageRelation?=?TextImageRelation.ImageAboveText; ?
- ????????????????if?(toggleItemList.Count?>?0) ?
- ????????????????{ ?
- ???????????????????? ?
- ????????????????????btn.BackgroundImage?=?((ToggleItem)toggleItemList[0]).BGImage; ?
- ????????????????????//btn.Width?=?toggleItemList[0].BGImage.Width; ?
- ????????????????????//btn.Height?=?toggleItemList[0].BGImage.Height; ?
- ????????????????????btn.Tag?=?((ToggleItem)toggleItemList[0]).Tag; ?
- ????????????????} ?
- ????????????????btn.Parent?=?this; ?
- ????????????????btn.Click?+=?new?EventHandler(ItemButtonClickHandler); ?
- ????????????} ?
- ????????????Button?bt?=?btnList[e.Index]; ?
- ????????????bt.Left?=?this.Width?-?bt.Width?-?20; ?
- ????????????bt.Top?=?e.Bounds.Top; ?
- ??????????? ?
- ????????} ?
- ????????///?<summary>?
- ????????///?item?button雙擊事件; ?
- ????????///?</summary>?
- ????????///?<param?name="sender"></param>?
- ????????///?<param?name="e"></param>?
- ????????protected?void?ItemButtonClickHandler(object?sender,?EventArgs?e) ?
- ????????{ ?
- ????????????int?index?=?-1; ?
- ????????????if?(sender?is?Button) ?
- ????????????????index?=?this.IndexFromPoint(((Button)sender).Location); ?
- ?
- ????????????if?(index?==?-1) ?
- ????????????????return; ?
- ?
- ????????????Button?btn?=?sender?as?Button; ?
- ????????????ToggleItem?togold?=?new?ToggleItem((string)btn.Tag,?btn.BackgroundImage); ?
- ????????????ToggleItem?tognew?=?this.GetNexttoggleItem(togold); ?
- ????????????//btn.Width?=?tognew.BGImage.Width; ?
- ????????????//btn.Height?=?tognew.BGImage.Height; ?
- ????????????btn.BackgroundImage?=?tognew.BGImage; ?
- ??????????? ?
- ????????????btn.Tag?=?tognew.Tag; ?
- ?
- ????????????ItemEventHandler?handler?=?(ItemEventHandler)Events[ItemLabelClickObj]; ?
- ????????????if?(handler?!=?null) ?
- ????????????{??? ?
- ???????????????? ?
- ????????????????handler(sender,?new?ItemButtonClickEventArgs(index));?; ?
- ????????????} ?
- ????????} ?
- ?
- ??????? ?
- ?
- ???????? ?
- ????} ?
- ????[Serializable] ?
- ????public?class?ToggleItem ?
- ????{ ?
- ????????private?string?tag; ?
- ????????private?Image?bgImage; ?
- ????????public?ToggleItem() ?
- ????????{ ?
- ????????} ?
- ????????public?ToggleItem(string?tag,?Image?bg) ?
- ???????{ ?
- ???????????this.tag?=?tag; ?
- ???????????this.bgImage?=?bg; ?
- ???????} ?
- ???????public?string?Tag ?
- ???????{ ?
- ????????????get ?
- ????????????{ ?
- ????????????????return?tag; ?
- ???????????} ?
- ???????????set ?
- ???????????{ ?
- ????????????????tag?=?value; ?
- ????????????} ?
- ????????} ?
- ?
- ??????public?Image?BGImage ?
- ????????{ ?
- ???????????get ?
- ???????????{ ?
- ???????????????return?bgImage; ?
- ???????????} ?
- ?
- ???????????set ?
- ???????????{ ?
- ???????????????bgImage?=?value; ?
- ?
- ???????????} ?
- ???????} ?
- ?
- ????} ?
- ?
- } ?
- ?
- ? ?
? 本文轉自 破狼 51CTO博客,原文鏈接:http://blog.51cto.com/whitewolfblog/832641,如需轉載請自行聯系原作者