Как отключить флажок флажок в DataGridView - формы Windows? - PullRequest
1 голос
/ 23 февраля 2009

У меня есть столбец флажка в DataGridView, и я хочу проверить, может ли пользователь установить флажок, подсчитав количество флажков, которые он щелкнул, и решив затем отключить проверку.

Может кто-нибудь подсказать мне, как это сделать эффективно?

1 Ответ

1 голос
/ 23 февраля 2009

Пример быстрого кода:

public partial class DGVCheckBoxTesting : Form
{

    private const int MAX_CHECKS = 5;

    public DGVCheckBoxTesting()
    {
        InitializeComponent();
        this.dataGridView1.Columns.Add("IntColumn", "IntColumn");
        this.dataGridView1.Columns.Add(new DataGridViewCheckBoxColumn { Name = "BoolColumn" });
        for (int i = 0; i <= 10; i++)
        {
            this.dataGridView1.Rows.Add(i, false);
        }

        this.dataGridView1.CellContentClick += new DataGridViewCellEventHandler(dataGridView1_CellContentClick);
        this.dataGridView1.CellContentDoubleClick += new DataGridViewCellEventHandler(dataGridView1_CellContentDoubleClick);
    }

    private void dataGridView1_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
    {
        this.ValidateCheckBoxState(e);
    }

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        this.ValidateCheckBoxState(e);
    }

    private void ValidateCheckBoxState(DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex != 1) //bool column
        { return; }

        this.dataGridView1.EndEdit();
        bool value = (bool)this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
        int counter = 0;
        foreach (DataGridViewRow row in this.dataGridView1.Rows)
        {
            if (row.Cells[1].Value != null && (bool)row.Cells[1].Value)
            {
                counter++;
            }
        }

        if (counter > MAX_CHECKS)
        {
            this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = false;
            this.dataGridView1.EndEdit();
        }
    }


}

По сути, этот код добавляет столбец Integer и столбец Bool в DataGridView. Затем, при событии CellContentClick, если щелкнуть по столбцу флажка, сначала мы фиксируем редактирование (если вы этого не сделаете, у вас будут всевозможные проблемы с выяснением, установлен флажок или нет). Затем мы перебираем строки и считаем все проверенные строки. Затем, если сумма больше, чем мы хотим разрешить, мы просто устанавливаем ее обратно в false и снова фиксируем редактирование. Проверьте это, это работает. Возможно, это не самое элегантное решение, но DGV может быть хитрым с флажками, поэтому я бы так и сделал.

РЕДАКТИРОВАТЬ: просто небольшое редактирование, я подключился к событию ContentDoubleClick, так как я заметил, что вы смогли пройти проверку, если вы быстро нажали на ячейку. Должно работать лучше сейчас.

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