生活随笔
收集整理的這篇文章主要介紹了
自定义控件---重写Listbox实现item图标变换和item点击事件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
????? 博客開通有一陣了,就是沒有時間寫,遺憾啊。!
??????這幾天做了個排序的自定義控件,在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,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的自定义控件---重写Listbox实现item图标变换和item点击事件的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。