2014-01-15 77 views
0

帮助! 我想做一个自定义的ListBox控件,可以用来从中选择一个DashStyle。问题是,当我将自定义组件拖动到我的窗体时,它会添加项目(这是可以的),但是当我运行程序时,它会再次添加项目,给我重复项目。 这里是我的代码:CustomListBox重复项目

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);   
     } 
    } 
} 

我希望得到任何帮助,或评论。谢谢!

+1

可能只是检查项目是否为空? if(Items.Count <= 0)Items.AddRange(styleNames); –

回答

0

我能够这样做是为了避开 -

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

不知怎的,它仍然显示的项目时,我的控件添加到我的形式。 有人可以解释为什么吗?如果有更好的方法。由于

+0

我认为你错了。如果只希望在非设计时模式下使用控件时才添加项目。然后代码应该是:'if(LicenseManager.UsageMode!= LicenseUsageMode.Designtime){Items.AddRange(styleNames); }(注意不相等的比较)。提示:你应该更新你的问题,而不是发布自己问题的答案。 – IronGeek

0

尝试改变控制的构造是这样的:

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);   
} 
0

VS设计师序列化的项目。当应用程序启动在第一个LineStyleListBox构造函数和第二个 - 在Form的InitializeComponent()中添加的样式时。

如果你想看到在德兴时间的样式,不希望有任何新的风格

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

一个简单的方法是使用一个bool hasAdded;,并将其设置为true,一旦你已经添加项目,在添加更多内容之前检查它。

希望这可以帮助别人!