2016-10-19 1 views
1

создать настраиваемый ListView, что унаследовал от стандартного ListView в .NET, чтобы показать enum значения, как его Items (WinForms проекта):Изменить адаптированное ListView.Items после каждой сборке

public class ScrapGroupsListView : ListView 
{ 
    public event EventHandler SelectedColorChanged; 

    private ScrapGroup _selectedGroup = ScrapGroup.None; 

    [DefaultValue(ScrapGroup.None)] 
    public ScrapGroup SelectedScrapGroup 
    { 
     get { return _selectedGroup; } 
     set 
     { 
      if (_selectedGroup != value) 
      { 
       _selectedGroup = value; 
       foreach (ListViewItem item in this.Items) 
       { 
        if (item != null) 
        { 
         if (item.Tag != null) 
         { 
          var itemColor = (ScrapGroup)item.Tag; 
          if (itemColor == ScrapGroup.None) 
           item.Checked = value == ScrapGroup.None; 
          else 
           item.Checked = value.HasFlag(itemColor); 
         } 
        } 
       } 

       if (SelectedColorChanged != null) 
        SelectedColorChanged.Invoke(this, EventArgs.Empty); 
      } 
     } 
    } 

    public ScrapGroupsListView() 
    { 
     this.Items.Clear(); 
     this.CheckBoxes = true; 
     this.HeaderStyle = ColumnHeaderStyle.None; 
     this.View = View.List; 

     foreach (var value in Enum.GetValues(typeof(ScrapGroup)).Cast<ScrapGroup>()) 
     { 
      this.Items.Add(new ListViewItem() 
      { 
       Name = value.ToString(), 
       Text = value.ToString(), 
       Tag = value, 
      }); 
     } 
    } 

    protected override void OnItemChecked(ItemCheckedEventArgs e) 
    { 
     base.OnItemChecked(e); 

     var checkedScrapGroup = (ScrapGroup)e.Item.Tag; 

     if (e.Item.Checked) 
      if (checkedScrapGroup == ScrapGroup.None) 
       SelectedScrapGroup = ScrapGroup.None; 
      else 
       SelectedScrapGroup |= checkedScrapGroup; 
     else 
      SelectedScrapGroup &= ~checkedScrapGroup; 
    } 
} 

ScrapGrouop мое перечисление:

[Flags] 
public enum ScrapGroup 
{ 
    None=0, 
    M=1, 
    E=2, 
    N=4, 
    H=8 
} 

, когда я поставил ScrapGroupsListView в моей форме, все в порядке, и контроль не имеет Items:

enter image description here

Но каждый раз, когда я строю свой проект, то ScrapGroup ценности добавить в ScrapGroupsListView.Items (время разработки):

после 1-го билда:

enter image description here

после 2-ой сборки:

enter image description here

и так далее.

Где проблема?

ответ

0

Вместо конструктора попытки:

protected override void OnCreateControl() 
    { 
     base.OnCreateControl(); 

     this.Items.Clear(); 
     this.CheckBoxes = true; 
     this.HeaderStyle = ColumnHeaderStyle.None; 
     this.View = View.List; 

     foreach (var value in Enum.GetValues(typeof(ScrapGroup)).Cast<ScrapGroup>()) 
     { 
      this.Items.Add(new ListViewItem() 
      { 
       Name = value.ToString(), 
       Text = value.ToString(), 
       Tag = value, 
      }); 
     } 
    } 
0

Каждый раз, когда вы открываете форму в конструкторе VS создает этот код:

private void InitializeComponent() 
{ 
    System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("None"); 
    System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("M"); 
    System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem("E"); 
    System.Windows.Forms.ListViewItem listViewItem4 = new System.Windows.Forms.ListViewItem("N"); 
    System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem("H"); 
    this.scrapGroupsListView1 = new ScrapGroupsListView(); 
    // 
    // scrapGroupsListView1 
    // 
    this.scrapGroupsListView1.CheckBoxes = true; 
    this.scrapGroupsListView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; 
    listViewItem1.StateImageIndex = 0; 
    listViewItem1.Tag = ScrapGroup.None; 
    listViewItem2.StateImageIndex = 0; 
    listViewItem2.Tag = ScrapGroup.M; 
    listViewItem3.StateImageIndex = 0; 
    listViewItem3.Tag = ScrapGroup.E; 
    listViewItem4.StateImageIndex = 0; 
    listViewItem4.Tag = ScrapGroup.N; 
    listViewItem5.StateImageIndex = 0; 
    listViewItem5.Tag = ScrapGroup.H; 
    this.scrapGroupsListView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] { 
    listViewItem1, 
    listViewItem2, 
    listViewItem3, 
    listViewItem4, 
    listViewItem5}); 

Вот почему ваши детали появляются в два раза. Первый набор из конструктора, второй набор от InitializeComponent().

Вы можете (и должны) удалить код с InitializeComponent(), но открытие формы в дизайнере снова завинчивается.

Чтобы предотвратить это, вы можете переместить код заполнения в отдельный метод и вызвать его из формы.

В вашем управления:

public ScrapGroupsListView() 
{ 
    this.CheckBoxes = true; 
    this.HeaderStyle = ColumnHeaderStyle.None; 
    this.View = View.List; 
} 

public void Fill() 
{ 
    this.Items.Clear(); 

    foreach(var value in Enum.GetValues(typeof(ScrapGroup)).Cast<ScrapGroup>()) 
    { 
     this.Items.Add(new ListViewItem() 
     { 
      Name = value.ToString(), 
      Text = value.ToString(), 
      Tag = value, 
     }); 
    } 
} 

В вашей форме:

public MainForm() 
{ 
    InitializeComponent(); 

    scrapGroupsListView1.Fill(); 
} 

Как недостаток в этом решении вы не видите ваши детали в конструкторе.

Смежные вопросы