DataGridView.CellContentClick - PullRequest
       6

DataGridView.CellContentClick

2 голосов
/ 19 декабря 2008

DataGridView.CellContentClick не запускается, если я щелкаю мышью по DataGridViewCheckBoxCell очень быстро. Как я могу решить это? Мне нужно знать, когда состояние проверки CheckBox изменяется

Ответы [ 4 ]

5 голосов
/ 22 декабря 2008

Попробуйте обработать событие CellMouseUp.
Вы можете проверить, в каком столбце произошло событие MouseUp, чтобы увидеть, является ли это вашим столбцом флажка.
Вы также можете узнать, находится ли он в режиме редактирования, и программно завершить режим редактирования, что, в свою очередь, вызовет событие CellValueChanged.

В приведенном ниже примере у меня есть DataGridView с двумя столбцами.
Первый - DataGridViewTextBoxColumn, а второй - DataGridViewCheckBoxColumn.
Когда флажок изменится, первый столбец будет отражать его состояние проверки, не выходя из строки или ячейки.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        dataGridView1.Rows.Add("False", false);
        dataGridView1.Rows.Add("True", true);
    }

    private void dataGridView1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
    {
        if (e.ColumnIndex == 1 && e.RowIndex >-1 && dataGridView1.Rows[e.RowIndex].Cells[1].IsInEditMode)
        {
            dataGridView1.EndEdit();
        }
    }

    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        if (e.RowIndex != -1)
        {
            dataGridView1.Rows[e.RowIndex].Cells[0].Value =
               dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(); 
        }
    }
}
4 голосов
/ 19 декабря 2008

Независимо от того, как быстро пользователь щелкает в ячейке флажка, значение не изменится с true на false или наоборот, пока они не выберутся из этой строки, и DataGridView не выйдет из режима редактирования.

То, что я делал в прошлом, для этого столбца установлено значение ReadOnly = true. Затем, в обработчике события CellContentClick, если щелкнуть этот столбец, я вручную перевернул bool следующим образом:

bool b = (bool)this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = !b;

Затем вы можете выполнить свою логику на этом этапе, что вы обычно делаете для CheckChanged.

2 голосов
/ 21 января 2013

Я немного опоздал на вечеринку, но у msdn есть очень хороший ответ на эту проблему здесь .

'Ends Edit Mode So CellValueChanged Event Can Fire
Private Sub EndEditMode(sender As System.Object, e As EventArgs) _
    Handles DataGridView1.CurrentCellDirtyStateChanged
    'if current cell of grid is dirty, commits edit
    If DataGridView1.IsCurrentCellDirty Then
        DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
    End If
End Sub

Я также написал очень подробную разработку исправления msdn и сообщений, найденных здесь на посте Запуск события DataGridView CellValueChanged Немедленно

1 голос
/ 11 марта 2011

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

grid.CellContentClick += delegate(object obj, DataGridViewCellEventArgs args)
{
    var cell = (settings_grid[args.ColumnIndex,args.RowIndex] as DataGridViewCheckBoxCell);

    if (cell != null)
    {
        bool new_value = !(bool)cell.Value;                                        
        RecordTheNewState(new_value); // you record the new checkbox state
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...