CheckedListBox.RemoveAt (lastItemIndex) вызывает проблему с отображением в списке - PullRequest
0 голосов
/ 23 августа 2010

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

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

дисплей выглядит следующим образом, когда последний элемент удален с указанным кодом.

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

почему это происходит? я что-то здесь упускаю? как я могу это исправить?

1 Ответ

1 голос
/ 23 августа 2010

Попробуйте вместо этого использовать BindingSource.Это обеспечивает DataSource представление, которое может информировать DGV об изменениях:

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