DataGridView: применить редактирование ко всем выбранным строкам - PullRequest
6 голосов
/ 14 марта 2012

У меня есть DataGridView, который связан со списком объектов POCO.Одним из свойств POCO является bool, который представлен флажком.Я хотел бы иметь возможность выбирать несколько строк, а затем, когда я нажимаю один из флажков, все выделенные строки имеют свои флажки.Например, если вы используете TFS под VS 2010, я пытаюсь повторить поведение на экране «Ожидающие изменения».

Моя проблема в том, что я не могу найти подходящее событие для прослушивания,Кажется, что большинство событий щелчка DataGridView работают на уровне столбца / строки, и я хочу что-то, что срабатывает, когда вы нажимаете флажок.CellContentClick идет ближе всего, но он запускает после , когда строки не были выбраны, поэтому это не сработает.

У кого-нибудь есть предложения?

Ответы [ 2 ]

12 голосов
/ 20 марта 2012

Вы можете использовать CurrentCellDirtyStateChanged, когда значение флажка изменилось. Но когда это событие сработает, выбранные строки исчезнут. Все, что вам нужно сделать, это сохранить выбранные строки перед ним.

Простой пример: вы можете легко его заполнить.

DataGridViewSelectedRowCollection selected;

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    DataGridView dgv = (DataGridView)sender;
    DataGridViewCell cell = dgv.CurrentCell;
    if (cell.RowIndex >= 0 && cell.ColumnIndex == 1) // My checkbox column
    {
        // If checkbox value changed, copy it's value to all selectedrows
        bool checkvalue = false;
        if (dgv.Rows[cell.RowIndex].Cells[cell.ColumnIndex].EditedFormattedValue != null && dgv.Rows[cell.RowIndex].Cells[cell.ColumnIndex].EditedFormattedValue.Equals(true))
            checkvalue = true;

        for (int i=0; i<selected.Count; i++)
            dgv.Rows[selected[i].Index].Cells[cell.ColumnIndex].Value = checkvalue;
    }

    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}

private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    selected = dataGridView1.SelectedRows;
}
1 голос
/ 24 марта 2012

Это не очень хороший дизайн, но вы можете попробовать использовать событие MouseDown (которое сработает до того, как сетка изменит выбор) и HitTest (чтобы узнать, где пользователь щелкает):

private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
{
    var hitTest = this.dataGridView1.HitTest(e.X, e.Y);
    if (hitTest.Type == DataGridViewHitTestType.Cell && hitTest.ColumnIndex == 0 /* set correct column index */)
    {
        foreach (DataGridViewRow row in this.dataGridView1.Rows)
        { 
            // Toggle
            row.Cells[0].Value = !((bool)row.Cells[0].Value);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...