winforms 使CustomListBox添加BorderColor,然后不能使用ListBox的常规属性/方法

s4chpxco  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(170)

我正在尝试更改列表框的边框颜色。
我做了这个自定义控件,我有一个函数,使边界的绘图。
在让它正常工作后,注意到不能再使用ListBox.Items了,方法如.Add()或.Clear()。
自定义列表框的代码:

class CustomListBox : UserControl
    {
        //Fields
        private Color borderColor = Color.MediumSlateBlue;
        private int borderSize = 1;

        //Items
        private ListBox Listb;

        //Properties
        [Category("Custom")]
        public Color BorderColor
        {
            get { return borderColor; }
            set
            {
                borderColor = value;
            }
        }

        [Category("Custom")]
        public int BorderSize
        {
            get { return borderSize; }
            set
            {
                borderSize = value;
                this.Padding = new Padding(borderSize);//Border Size
                AdjustListBoxDimensions();
            }
        }



        public CustomListBox()
        {
            Listb = new ListBox();
            this.SuspendLayout();
            // ListBox
            Listb.BorderStyle = BorderStyle.None;
            Listb.DrawMode = DrawMode.OwnerDrawFixed;
            Listb.ForeColor = Color.FromArgb(((int)(((byte)(249)))), ((int)(((byte)(249)))), ((int)(((byte)(249)))));
            Listb.FormattingEnabled = true;
            Listb.ItemHeight = 24;
            Listb.Location = new Point(567, 64);
            Listb.Name = "CustomListBox";
            Listb.Size = new Size(235, 936);
            Listb.DrawItem += new DrawItemEventHandler(Listb_DrawItem);

            this.MinimumSize = new Size(200, 30);
            this.Size = new Size(200, 30);
            this.Padding = new Padding(borderSize);//Border Size
            this.Font = new Font(this.Font.Name, 12F);
            this.ResumeLayout();
            AdjustListBoxDimensions();

        }

        // Highlight event
        private void Listb_DrawItem(object sender, DrawItemEventArgs e)
        {
            Color backgroundColor = Color.FromArgb(50, 50, 50);
            Color horizontalColor = Color.FromArgb(100, 100, 100);

            if (e.Index >= 0)
            {
                SolidBrush sb = new SolidBrush(((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? horizontalColor : backgroundColor);
                e.Graphics.FillRectangle(sb, e.Bounds);
                string text = Listb.Items[e.Index].ToString();
                SolidBrush tb = new SolidBrush(e.ForeColor);
                e.Graphics.DrawString(text, e.Font, tb, Listb.GetItemRectangle(e.Index).Location);
            }
        }

        //Adjust Dimension (Still in test)
        private void AdjustListBoxDimensions()
        {
            Listb.Location = new Point()
            {
                X = this.Width - this.Padding.Right - Listb.Width,
                Y = Listb.Height
            };
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics graph = e.Graphics;
            //Draw border
            using (Pen penBorder = new Pen(borderColor, borderSize))
            {
                penBorder.Alignment = PenAlignment.Inset;
                graph.DrawRectangle(penBorder, 0, 0, this.Width - 0.5F, this.Height - 0.5F);
            }
        }


    }

我的问题是我不能使用列表框的属性/方法,有没有办法继承它们?

wnvonmuf

wnvonmuf1#

既然已经创建了自己的控件,就必须创建自己的属性和方法,调用Listbox的方法和getter/setter
就像这样:

public void Add(object item)
{
    this.Listb.Items.Add(item);
}

public ObjectCollection ListItems
{
    get
    {
        return this.Listb.Items;
    }
    set
    {
        this.Listb.Items.AddRange(value);
    }
}

//etc...
jaxagkaj

jaxagkaj2#

public void Add(object item)
    {
        this.Listb.BeginUpdate();
        this.Listb.Items.Add(item);
        this.Listb.EndUpdate();
    }

    public void Clear()
    {
        this.Listb.BeginUpdate();
        this.Listb.Items.Clear();
        this.Listb.EndUpdate();
    }

    public int SelectedIndex()
    {
        return this.Listb.SelectedIndex;
    }

    public object Item(int index)
    {
        return this.Listb.Items[index];
    }

添加到代码:Dock=填充此控件.add(listb)

相关问题