Строка DataGridView остается грязной после принятия изменений - PullRequest
5 голосов
/ 11 января 2010

DataGridView.IsCurrentRowDirty остается true после того, как я фиксирую изменения в базе данных. Я хочу установить false, чтобы он не срабатывал RowValidating при потере фокуса.

У меня есть DataGridView, привязанный к BindingList<T>. Я обрабатываю событие CellEndEdit и сохраняю изменения в базе данных. После сохранения этих изменений я бы хотел, чтобы DataGridView.IsCurrentRowDirty был установлен на true, поскольку все ячейки в строке обновлены; тем не менее, он установлен на false.

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

Вот пример того, что у меня есть:

void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
    // Ignore cell if it's not dirty
    if (dataGridView.isCurrentCellDirty)
        return;

    // Validate current cell.
}

void dataGridView_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
{
    // Ignore Row if it's not dirty
    if (!dataGridView.IsCurrentRowDirty)  
        return;

    // Validate all cells in the current row.
}

void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    // Validate all cells in the current row and return if any are invalid.

    // If they are valid, save changes to the database

    // This is when I would expect dataGridView.IsCurrentRowDirty to be false.
    // When this row loses focus it will trigger RowValidating and validate all 
    // cells in this row, which we already did above.
}

Я читал посты, в которых говорилось, что я могу вызвать метод Validate() формы, но это вызовет срабатывание RowValidating, чего я и стараюсь избегать.

Есть идеи, как установить DataGridView.IsCurrentRowDirty на true? Или, может быть, способ предотвратить ненужную проверку RowValidating всех ячеек?

Ответы [ 2 ]

3 голосов
/ 19 января 2010

Вы пытались вызвать DataGridView1.EndEdit () после сохранения данных в базе данных.

0 голосов
/ 26 января 2013

У меня была та же проблема с Validating стрельбой дважды. Однажды перед редактированием был произведен (как и ожидалось), но затем снова о том, что я думаю, было DataGridView изменение фокуса.

У меня не было времени для расследования. Быстрое исправление - this.ActiveControl = null; Я не уверен, что это имеет какие-то непредвиденные последствия, но оно исправляет проблему проверки, программно не затрагивая элемент управления.

private void cntrl_MethodParameters_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
    //Init
    var dgv = (DataGridView)sender;
    int row = e.RowIndex;
    int col = e.ColumnIndex;

    //Validate Edit
    if ((row >= 0) && (col == cntrl_MethodParameters.Columns.IndexOf(cntrl_MethodParameters.Columns[MethodBuilderView.m_paramValueCol])))
    {
        string xPropertyName = (string)cntrl_MethodParameters[MethodBuilderView.m_paramNameCol, row].EditedFormattedValue;
        string xPropertyValue = (string)cntrl_MethodParameters[MethodBuilderView.m_paramValueCol, row].EditedFormattedValue;
        bool Validated = FactoryProperties.Items[xPropertyName].SetState(xPropertyValue);

        //Cancel Invalid Input
        if (!Validated)
        {
            dgv.CancelEdit();
        }
    }
    this.ActiveControl = null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...