我想做个类似listBox的空间,
不过比它复杂点,
就是在每个item前加个checkbox,后面加个textbox,

不是将3个控件拖到一个usercontrol啊 !!申明:是改造 啊 我记得datagridview就有这个功能。请大家帮忙找下,原创的分就更多了

解决方案 »

  1.   

    那就是自定义控件了。继承Listbox,扩展功能。
      

  2.   

    继承类自己扩展
    其实我觉得拖到UserControl的方法更好
      

  3.   


    那有哪些要注意的吗?
    比如怎么画checkbox和textbox呢?
      

  4.   


    楼主,要制造的最终控件的外部形象和控件功能,没有描述清楚。自己画checkbox和textbox?有现成不用,制作一个,不可取。
      

  5.   

    1行  [checkbox] [string] [textbox]
    2行  [checkbox] [string] [textbox]
    3行  [checkbox] [string] [textbox]
    4行  [checkbox] [string] [textbox]
    5行  [checkbox] [string] [textbox]
    .
    .
    ..
      

  6.   

    //类似一个表格
    //继承CheckListBox
    //各数组控件索引号对应行号TextBox[] tbs=new TexBox[n];
    Label[] lbs=new Label[n]
    for(int =0;i<n;i++)
    {
       // 定位(行距,列距 ---> Location)、赋值、...
       // 添加到容器 Controls.Add(...);
    }
      

  7.   

    主要重写drawItem事件;
    我也刚写了一个事后边加一个button
    设置button parent 和location显示
      

  8.   

    还是把代码贴一下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.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;
                    MDIChildListBoxItem item = (MDIChildListBoxItem)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)
                    {
                        index = i;
                        break;
                    }
                }
                return ((ToggleItem)ToggleItemList[(index + 1) % ToggleItemList.Count]);
            }
            private List<ToggleItem> toggleItemList 
            [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)); ;
                }
            }               #region 
            private static readonly object ItemLabelClickObj = new object();
            public delegate void ItemEventHandler(object sender, ItemButtonClickEventArgs e);
            public class ItemButtonClickEventArgs : EventArgs
            {
                private int index;
                public ItemButtonClickEventArgs(int index)
                    : base()
                {
                    this.index = index;
                }
                public int Index
                {
                    get
                    {
                        return index;
                    }
                }
            }        public event ItemEventHandler ItemLabelClick
            {
                add
                {
                    Events.AddHandler(ItemLabelClickObj, value);
                }
                remove
                {
                    Events.RemoveHandler(ItemLabelClickObj, value);
                }
            }
            #endregion
        }
        [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;            }
            }    }}