2010-08-23 11 views
0

J'ai une liste de contrôle qui est liée à une liste générique de type personnalisé. Lorsque je supprime d'autres éléments de la liste, l'affichage est correct, mais lorsque je supprime le dernier élément de la liste, la liste s'affiche avec le nom du type au lieu du nom d'affichage.CheckedListBox.RemoveAt (lastItemIndex) provoque un problème d'affichage dans la liste

_selResolutions.RemoveAt(selIndex); 
cklResolutions.DataSource = null; 
cklResolutions.BeginUpdate(); 
cklResolutions.DataSource = _selResolutions; 
cklResolutions.DisplayMember = "LongDesc"; 
cklResolutions.ValueMember = "LongDesc"; 
cklResolutions.EndUpdate(); 
for (var i = 0; i < _selResolutions.Count; i++) 
{ 
    cklResolutions.SetItemChecked(i, _selResolutions[i].Selected); 
} 

l'écran ressemble à ceci lorsque le dernier élément est supprimé w/code ci-dessus.

[ ] Resolution 
[ ] Resolution 
[ ] Resolution 
[ ] Resolution 
[ ] Resolution 

Pourquoi cela se produit-il? Est-ce que j'ai râté quelque chose? comment puis-je corriger cela?

+0

De quel type est _selResolutions? – Wildhorn

Répondre

1

Essayez plutôt d'utiliser BindingSource. Cela fournit à DataSource une vue qui peut informer la DGV des modifications:

using System; 
using System.Collections.Generic; 
using System.Windows.Forms; 

class Form1 : Form 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 

    List<MyItem> _selResolutions; 
    CheckedListBox cklResolutions; 

    public Form1() 
    { 
     Controls.Add(cklResolutions = new CheckedListBox { Dock = DockStyle.Fill }); 

     _selResolutions = new List<MyItem>(); 
     _selResolutions.Add(new MyItem { LongDesc = "One", Selected = true }); 
     _selResolutions.Add(new MyItem { LongDesc = "Two", Selected = false }); 
     _selResolutions.Add(new MyItem { LongDesc = "Three", Selected = false }); 
     _selResolutions.Add(new MyItem { LongDesc = "Four", Selected = true }); 

     cklResolutions.DataSource = new BindingSource(_selResolutions, null); 
     cklResolutions.DisplayMember = cklResolutions.ValueMember = "LongDesc"; 

     UpdateCheckBoxes(); 

     cklResolutions.KeyUp += new KeyEventHandler(cklResolutions_KeyUp); 
    } 

    private void UpdateCheckBoxes() 
    { 
     for (int n = 0; n < _selResolutions.Count; n++) 
      cklResolutions.SetItemChecked(n, _selResolutions[n].Selected); 
    } 

    void cklResolutions_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Delete) 
     { 
      int index = cklResolutions.SelectedIndex; 
      if (index >= 0) 
      { 
       BindingSource bs = cklResolutions.DataSource as BindingSource; 
       bs.RemoveAt(index); 
       UpdateCheckBoxes(); 
      } 
     } 
    } 
} 

class MyItem 
{ 
    public string LongDesc { get; set; } 
    public bool Selected { get; set; } 
} 
+0

cela a fonctionné. Merci! – sjlewis