EndEdit в BindingSource обновляет DataTable, но состояние строки все еще остается неизменным - PullRequest
1 голос
/ 09 августа 2011

У меня есть источник привязки, у которого есть источник данных, который является датируемым.
Все элементы управления winforms добавили привязки данных к источнику привязки

Я изменяю значение в графическом интерфейсе (пишет в элементы управления '.свойство text)

, затем при сохранении я делаю следующее

  bsSending.EndEdit();      

((DataRowView)this.bsSending.Current).Row) теперь содержит новые значения, но RowState все еще остается неизменным.Как это может быть возможным?У меня нет звонков на AcceptChanges(), пока я не изменил значение в графическом интерфейсе

Ответы [ 7 ]

2 голосов
/ 09 августа 2011

UPDATE:

Не знаю почему, но кажется, что вызов EndEdit определенной строки делает свое дело. Родитель строки - это набор данных, а набор данных таблицы - это источник данных источника данных bsSending. Вызов bsSending.EndEdit () только обновляет значения, но не обновляет состояние строки.

Я просматривал .net для подобных проблем, и они указывают, что при вызове AcceptChanges () для набора данных ДО привязки данных, вы можете получить эту ошибку (значения обновляются до набора данных, но состояние строки остается неизменным). Однако я не нашел решения этой проблемы, поэтому я сохраняю свое обходное решение

1 голос
/ 08 ноября 2016

Я знаю, что это старый пост. Это можно решить, позвонив DataRowView.EndEdit напрямую, но в моем случае я нашел точную причину:

Я случайно связал два свойства одного элемента управления с разными столбцами. (В моем случае я одновременно связал свойства Devexpress 'TextEdit control - EditValue и Text с различными столбцами лежащей в основе таблицы).

Может быть, это поможет кому-то даже в 2016+, потому что это была неприятная ошибка, чтобы поймать.

1 голос
/ 24 октября 2013

Я столкнулся с подобной ситуацией в одной форме, и я понял, что проблема была в привязке к меткам ToolTip свойство .Сначала я понял, что когда я изменил значение для null с null на какую-то строку, проблема исчезла, но после некоторых других изменений, внесенных в проект, проблема снова возникла.Когда я удалил привязку к свойству ToolTip , проблема снова исчезла.Тем не менее, я не знаю, навсегда.

0 голосов
/ 01 мая 2018

@ Ответ Яна Стрнада просветил меня и помог мне решить мою проблему.

Проблема : Я использовал источник привязки в выигрышных формах.При связывании элементов управления в форме я пропустил щелчок и привязал поле к свойству Text формы в (DataBindings).Это же поле источника привязки было привязано (правильно) к списку.Из-за этой двойной привязки к полю состояние строки никогда не менялось с Не изменено .

Исправление : если строки не обновляются и вы используете источник привязки, сначала проверьте, правильно ли установлены привязки.

0 голосов
/ 17 марта 2016

Чтобы зафиксировать изменения строки программным способом, вызовите метод Validate формы.Если ваш источник данных - BindingSource, вы также можете вызватьBindingSource.EndEdit.

см. IsCurrentRowDirty

0 голосов
/ 20 октября 2013

У меня похожая проблема. У меня есть сетка на первой вкладке и текстовые поля на второй вкладке, все привязаны к одному источнику привязки. Я изменяю содержимое строки, содержимое изменяется в сетке, но начало строки не изменяется.

Мой код был:

DataRow dataRow =  ((DataRowView)bindingSource1.Current).Row;
if(dataRow.RowState != DataRowState.Modified)

Я ожидал, что у меня будет измененное состояние строки.

Отсутствующий код:

bindingSource1.EndEdit();

Полное решение здесь:

private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (tabControl1.SelectedIndex == 0)
    {
        bindingSource1.EndEdit();
        DataRow dataRow =  ((DataRowView)bindingSource1.Current).Row;
        if(dataRow.RowState != DataRowState.Modified)
        {
            return;
        }
        DialogResult userOption = MessageBox.Show("Save?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (userOption == System.Windows.Forms.DialogResult.Yes)
        {
            Save();
        }
    }
}

Мое решение:

0 голосов
/ 17 августа 2013

Да, у меня такой же опыт.Я использую Visual Studio 2010 и .NET Framework v.4.0.Я работаю с элементом управления DataGridView, который связан с DataTable.

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

Это код, который работает для меня:

if (dgv.IsCurrentCellInEditMode)
{
                dgv.EndEdit();
                updatedData.Rows[dgv.CurrentCell.RowIndex].EndEdit();
}
            if (updatedData.GetChanges() != null && updatedData.GetChanges().Rows.Count > 0)
{
     // if there are changes, update the dataset
}

Я хочу отметить, что мне нужно было вызвать оба - EndEdit () в DataGridViewчтобы закончить редактирование.Затем вызовите EndEdit () в DataTable, чтобы пометить строку как «измененную».

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