Поведение флажка ListView - PullRequest
0 голосов
/ 10 июня 2011

У меня есть приложение Winform, которое я модифицирую для друга.Он имеет вид списка и хочет, чтобы я добавил флажок в каждую строку и сделал их взаимоисключающими.Поэтому, когда я тестировал, как заставить это работать, я обнаружил странное поведение, и когда я прыгал, кто-то мог сказать мне, что мне не хватает.

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

Независимо от того, где я щелкну строку, все флажки в невыбранных строках будут сняты.Вот моя маленькая тестовая программа.Я использую .NET 4


public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {
        TestListView.Items.Add("Bob");
        TestListView.Items.Add("Ann");
        TestListView.Items.Add("Frank");
    }

    void TestListView_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e) {
        ListViewItem currentItem = TestListView.GetItemAt(e.X, e.Y);
        if (currentItem != null) {
            foreach (ListViewItem item in TestListView.Items) {
                if (item.Text == currentItem.Text) {
                    item.Checked = true;
                    item.Selected = !currentItem.Selected;
                }
                else 
                    item.Checked = false;
            }
        }
    }
}   

Ответы [ 2 ]

1 голос
/ 27 июля 2011

У меня сейчас тоже очень похожая проблема, однако, в ответ на Тимви, это не код, выполняющий проверку.Я проходил через это очень медленно, и когда код срабатывает при нажатии на флажок, он утверждает, что проверил его.Но когда форма возобновляется, она снова не проверяется.Прочитав сообщение Тимви, он привел меня к ответу.Не код выполняет непроверенную проверку, а событие winforms, запускающее впоследствии, которое снимает флажок.Это исправляет это:

Мой код:

private bool allowCheck = false;
private bool preventOverflow = true;

private void lstvwRaiseLimitStore_MouseClick(object sender, MouseEventArgs e)
    {
        preventOverflow = false;
        ListViewItem item = lstvwRaiseLimitStore.HitTest(e.X, e.Y).Item;
        if (item.Checked)
        {
            allowCheck = true;
            item.Checked = false;
        }
        else
        {
            allowCheck = true;
            item.Checked = true;
        }
    }

private void lstvwRaiseLimitStore_ItemChecked(object sender, ItemCheckedEventArgs e)
    {
        if (!preventOverflow)
        {
            if (!allowCheck)
            {
                preventOverflow = true;
                e.Item.Checked = !e.Item.Checked;
            }
            else
                allowCheck = false;
        }
    }

Итак, что он делает, сначала я должен установить флаг, чтобы предотвратить переполнение, в противном случае, когда форма создается или когда вы снимаете галочкуОкно, проверяющее флажок, продолжает циклировать код и в конечном итоге переполняет стек.Следующий флаг - это фактическая проверка разрешения флажка с помощью вашего кода, а не с помощью другого метода.

Нажав на элемент, он определяет, где был щелчок, а затем устанавливает флаг, позволяющий выполнить проверку.Затем код устанавливает флажок, и раздел проверенных элементов запускается, потому что это было сделано нашим кодом, он ничего не делает, только сбрасывает флаг allowcheck.

Если вы нажали на строку, она больше ничего не делает, однакоесли это был флажок, в конце нашего кода функция Windows запускается и пытается установить флажок, поскольку флаг allowcheck имеет значение false, код сначала устанавливает флаг, чтобы сказать, что я уже запрещаю проверку, а затем сбрасываетпроверка обратно в первоначальный статус.Поскольку это сделано, событие itemchecked запускается снова, но код установил флаг, чтобы он ничего не делал.Затем код завершается, и он не позволяет Windows установить флажок и разрешает только наш код.

Надеюсь, это поможет!

1 голос
/ 10 июня 2011

Кажется, что WinForms проверяет флажок, когда вы нажимаете на флажок напрямую, а затем ваш код немедленно отменяет проверку, поэтому вы никогда не видите его.

Возможно, вместо MouseClick вам следует использовать ItemCheck или ItemChecked событие.Первое вызывается до изменения свойства Checked, второе - после.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...