自定义列表框重复项



救命!我正在尝试制作一个可用于从中选择破折号样式的自定义列表框控件。问题是当我将自定义组件拖到我的表单中时,它会添加项目(没关系),但是当我运行程序时,它会再次添加项目,给我重复项。这是我的代码:

namespace Help
{
    public partial class LineStyleListBox : ListBox
    {
        private Pen[] pens;
        string[] styleNames;
        public LineStyleListBox()
        {
            InitializeComponent();               
            styleNames = System.Enum.GetNames(typeof(DashStyle));
            pens = new Pen[styleNames.Length];
            for (int i = 0; i != pens.Length; i++) 
            {
                pens[i] = new Pen(new SolidBrush(Color.Black), 1);
                pens[i].DashStyle = (DashStyle)i;
            }                          
            Items.AddRange(styleNames);          
        }
    }
}

我将不胜感激任何帮助或评论。谢谢!

我能够通过这样做来绕过 -

if(LicenseManager.UsageMode == LicenseUsageMode.Designtime)
            Items.AddRange(styleNames);    

不知何故,当我将控件添加到窗体时,它仍然显示项目。有人可以解释为什么吗?如果有更好的方法。谢谢

尝试像这样更改控件的构造函数:

public LineStyleListBox()
{
  InitializeComponent();      
  // do not add items if the control is in design mode
  if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
    return;
  styleNames = System.Enum.GetNames(typeof(DashStyle));
  pens = new Pen[styleNames.Length];
  for (int i = 0; i != pens.Length; i++) 
  {
    pens[i] = new Pen(new SolidBrush(Color.Black), 1);
    pens[i].DashStyle = (DashStyle)i;
  }                          
  Items.AddRange(styleNames);          
}

VS Designer 序列化这些项目。当应用程序启动在 LineStyleListBox 构造函数中的第一个和窗体的 InitializeComponent() 中的第二个 - 添加的样式时。

如果您想在Desing时查看样式并且不想有任何新样式

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new ListBox.ObjectCollection Items
{
    get { return base.Items; }
}

一个简单的方法是使用 bool hasAdded; ,并在添加项目后将其设置为 true,在添加更多项目之前对其进行检查。

希望这对某人有所帮助!

最新更新