zl程序教程

您现在的位置是:首页 >  其他

当前栏目

自定义控件---重写Listbox实现item图标变换和item点击事件

事件重写 实现 自定义 --- 控件 点击 图标
2023-09-14 09:00:58 时间
 博客开通有一阵了,就是没有时间写,遗憾啊。!
      这几天做了个排序的自定义控件,在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;
 10
 11namespace SQLAnalysis
 12ExpandedBlockStart.gif{
 13    public class ListBoxEx : ListBox
 14ExpandedSubBlockStart.gif    {
 15        public ListBoxEx()
 16ExpandedSubBlockStart.gif        {
 17            this.DrawMode = DrawMode.OwnerDrawFixed;
 18            btnList = new List Button ();
 19        }
 20        public override DrawMode DrawMode
 21ExpandedSubBlockStart.gif        {
 22            get
 23ExpandedSubBlockStart.gif            {
 24                return DrawMode.OwnerDrawFixed;
 25            }
 26            set
 27ExpandedSubBlockStart.gif            {
 28                base.DrawMode = DrawMode.OwnerDrawFixed;
 29            }
 30        }
 31       
 32        protected override void OnResize(EventArgs e)
 33ExpandedSubBlockStart.gif        {
 34            base.OnResize(e);
 35            this.Refresh();
 36        }
 37
 38
 39
 40
 41        public Button FindItemButton(int index)
 42ExpandedSubBlockStart.gif        {
 43            
 44        // return this.Controls.Find(this.Name + "$ItemComboBox" + index.ToString(), true)[0];
 45            if (index  = btnList.Count)
 46                return null;
 47            return btnList[index];
 48           
 49        }
 50
 51ExpandedSubBlockStart.gif        ///  summary
 52        /// 提供删除item项
 53        ///  /summary
 54        ///  param name="index" /param
 55        public void RemoveItem(int index)
 56ExpandedSubBlockStart.gif        {
 57            this.Items.RemoveAt(index);
 58            btnList[index].Parent = null;
 59            btnList[index] = null;
 60            //btnList[index].Dispose();
 61            
 62            btnList.RemoveAt(index);
 63            this.Refresh();
 64        }
 65ExpandedSubBlockStart.gif        ///  summary
 66        /// 提供移动item项
 67        ///  /summary
 68        ///  param name="offset" /param
 69        public void MoveItem(int offset)
 70ExpandedSubBlockStart.gif        {
 71            
 72            int index = this.SelectedIndex + offset;
 73            if (index   -1   index   this.Items.Count)
 74ExpandedSubBlockStart.gif            {
 75                int oldSelectedIndex = this.SelectedIndex;
 76                Object item = this.SelectedItem;
 77                this.Items.RemoveAt(oldSelectedIndex);
 78                this.Items.Insert(index, item);
 79                Button btn = btnList[oldSelectedIndex];
 80                btnList.RemoveAt(oldSelectedIndex);
 81                btnList.Insert(index, btn);
 82
 83                this.Refresh();
 84            }
 85            else
 86ExpandedSubBlockStart.gif            {
 87                MessageBox.Show("不是可用的移动矢量");
 88
 89            }
 90
 91        }
 92
 93        private ToggleItem GetNexttoggleItem(ToggleItem tog)
 94ExpandedSubBlockStart.gif        {
 95            int index = -1;
 96            for (int i = 0; i   ToggleItemList.Count; i++)
 97ExpandedSubBlockStart.gif            {
 98                ToggleItem item =(ToggleItem)ToggleItemList[i];
 99                if (item.Tag == tog.Tag)
100ExpandedSubBlockStart.gif                {
101                    index = i;
102                    break;
103                }
104            }
105            return ((ToggleItem)ToggleItemList[(index + 1) % ToggleItemList.Count]);
106        }
107        private List ToggleItem  toggleItemList ;//List ToggleItem  toggleItemList = new List ToggleItem
108        [Bindable(false), Browsable(false)]
109        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]   
110        public List ToggleItem  ToggleItemList
111ExpandedSubBlockStart.gif        {
112            get
113ExpandedSubBlockStart.gif            {
114                if (toggleItemList == null)
115                    toggleItemList = new List ToggleItem ();
116                return toggleItemList;
117            }
118
119            set
120ExpandedSubBlockStart.gif            {
121                if (toggleItemList == null)
122                    toggleItemList = new List ToggleItem ();
123                toggleItemList = value;
124            }
125        }
126
127        //主要重写事件
128        protected override void OnDrawItem(DrawItemEventArgs e)
129ExpandedSubBlockStart.gif        {
130            this.DrawMode = DrawMode.OwnerDrawFixed;
131            this.ItemHeight = 22;
132            e.DrawBackground();
133            e.DrawFocusRectangle();
134            Brush myBrush = Brushes.Black;
135            if (e.Index   -1   e.Index   this.Items.Count)
136ExpandedSubBlockStart.gif            {
137                string drawString = (e.Index + 1)+ " " + this.Items[e.Index].ToString();
138                
139
140                e.Graphics.DrawString(drawString, e.Font, new SolidBrush(e.ForeColor), e.Bounds, 
141
142StringFormat.GenericDefault);
143                AddButtonToItem(e);
144            }
145            base.OnDrawItem(e);
146
147        }
148
149        private List Button  btnList = null;
150        protected void AddButtonToItem(DrawItemEventArgs e)
151ExpandedSubBlockStart.gif        {
152            if (btnList.Count  = e.Index)
153ExpandedSubBlockStart.gif            {
154                btnList.Add(new Button());
155                Button btn = btnList[e.Index];
156                btn.BackColor = System.Drawing.Color.LightSkyBlue ;
157                btn.Name = this.Name + "$ItemButton" + e.Index.ToString();
158                btn.Width = 20;
159                btn.Height = 20;
160                btn.ImageAlign = ContentAlignment.MiddleCenter;
161                btn.TextImageRelation = TextImageRelation.ImageAboveText;
162                if (toggleItemList.Count   0)
163ExpandedSubBlockStart.gif                {
164                    
165                    btn.BackgroundImage = ((ToggleItem)toggleItemList[0]).BGImage;
166                    //btn.Width = toggleItemList[0].BGImage.Width;
167                    //btn.Height = toggleItemList[0].BGImage.Height;
168                    btn.Tag = ((ToggleItem)toggleItemList[0]).Tag;
169                }
170                btn.Parent = this;
171                btn.Click += new EventHandler(ItemButtonClickHandler);
172            }
173            Button bt = btnList[e.Index];
174            bt.Left = this.Width - bt.Width - 20;
175            bt.Top = e.Bounds.Top;
176           
177        }
178ExpandedSubBlockStart.gif        ///  summary
179        /// item button双击事件;
180        ///  /summary
181        ///  param name="sender" /param
182        ///  param name="e" /param
183        protected void ItemButtonClickHandler(object sender, EventArgs e)
184ExpandedSubBlockStart.gif        {
185            int index = -1;
186            if (sender is Button)
187                index = this.IndexFromPoint(((Button)sender).Location);
188
189            if (index == -1)
190                return;
191
192            Button btn = sender as Button;
193            ToggleItem togold = new ToggleItem((string)btn.Tag, btn.BackgroundImage);
194            ToggleItem tognew = this.GetNexttoggleItem(togold);
195            //btn.Width = tognew.BGImage.Width;
196            //btn.Height = tognew.BGImage.Height;
197            btn.BackgroundImage = tognew.BGImage;
198           
199            btn.Tag = tognew.Tag;
200
201            ItemEventHandler handler = (ItemEventHandler)Events[ItemLabelClickObj];
202            if (handler != null)
203ExpandedSubBlockStart.gif            {   
204                
205                handler(sender, new ItemButtonClickEventArgs(index)); ;
206            }
207        }
208
209       
210
211ContractedSubBlock.gif        
243    }
244    [Serializable]
245    public class ToggleItem
246ExpandedSubBlockStart.gif    {
247        private string tag;
248        private Image bgImage;
249        public ToggleItem()
250ExpandedSubBlockStart.gif        {
251        }
252        public ToggleItem(string tag, Image bg)
253ExpandedSubBlockStart.gif       {
254           this.tag = tag;
255           this.bgImage = bg;
256       }
257       public string Tag
258ExpandedSubBlockStart.gif       {
259            get
260ExpandedSubBlockStart.gif            {
261                return tag;
262           }
263           set
264ExpandedSubBlockStart.gif           {
265                tag = value;
266            }
267        }
268
269      public Image BGImage
270ExpandedSubBlockStart.gif        {
271           get
272ExpandedSubBlockStart.gif           {
273               return bgImage;
274           }
275
276           set
277ExpandedSubBlockStart.gif           {
278               bgImage = value;
279
280           }
281       }
282
283    }
284
285} 复制代码




  以前用 telerik ui做的grid现在又要换成kendo ui,不过说句实话kendo ui真的比telerik好多,可以说超级升级改头换面。当然用的mvc的辅助方法,以前的telerik ui 选中行的事件是 .OnRowSelect( SelectRow ) ,换成kendo ui 选中行的事件是   .Events(p= p.Change( SelectRow )) kendo ui  grid 选中行的事件是  .Events(p= p.Change( SelectRow ))  。
private long dragResponseMS = 700; // item长按响应的时间 private int mDragPosition;// 正在拖拽的posi
(C#)ListView双击Item事件 ListView没有Item的双击事件,只能通过变通的方法得到,以下是我的变通方法        private void listView右侧_MouseDoubleClick( object sender , MouseEventArgs e )        {            ListViewHitTestInfo info = listView右侧.