C # DataGrid автоматически записывает значения в БД - PullRequest
0 голосов
/ 12 октября 2010

У меня есть представление таблицы данных, которое показывает данные таблицы из базы данных

Окружающая среда: - C # 4.0 - SQL Server 2005 - Визуальная студия 2010

То, что я хочу: На построчном автоматическом сохранении изменений. Поэтому, когда я редактирую первый ряд, а затем покидаю ряд. Следует сохранить изменения в базе данных.

Я использовал этот код:

В загрузке From1:

dataSet1.TblObject.RowChanged += rowUpdate;

Обработчик событий:

private void rowUpdate(object sender, DataRowChangeEventArgs e)
{ 
    DataRow dr = e.Row;
    if (dr.RowState == DataRowState.Modified)
    {
        tblObjectTableAdapter.Update(dr);
    }
}

Когда я редактировал строку в сетке, tblObjectTableAdapter.Update(dr); вызывается, данные сохраняются в таблице. И это хорошо. Но событие продолжает срабатывать, как если бы оно вызывалось рекурсивно. Таким образом, tblObjectTableAdapter.Update(dr); вызывает событие dataSet1.TblObject.RowChanged. Но я не могу различить их обоих. Я предполагаю, что использую неправильное событие для хранения своих значений, но я не могу найти событие, которое звучит логично для меня. Что я делаю не так?

Я сделал набор данных xsd:

TblObject

Я выбрал набор данных в качестве источника данных в этом виде сетки:

alt text

1 Ответ

0 голосов
/ 12 октября 2010

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

Тогда вам нужно составить список датаров, и каждый раз, когда строка изменяется, добавляйте этот элемент в список, таким образом, обновления не производятся напрямую, а только когда вы нажимаете кнопку. (Это также намного лучше для повышения производительности.)

Так что вместо кода

DataRow dr = e.Row; 
if (dr.RowState == DataRowState.Modified) 
{ 
    tblObjectTableAdapter.Update(dr); 
}

U должно составить

 DataRow dr = e.Row; 
    if (dr.RowState == DataRowState.Modified) 
    { 
DatarowLst.Add(dr); 
    } 

ButtonSave_Click(object sender, eventargs e)
{
foreach (DataRow d in DatarowLst)
{
tblObjectTableAdapter.Update(d); 
}
}

EDIT:

Хорошо, извините за недопонимание. Теперь я понимаю вашу проблему и изучил проблему.

Я нашел интересную информацию об адаптерах и таблицах данных. Кажется, что Адаптер выполняет проверку строки за строкой, чтобы получить информацию о внесенных изменениях (т. Е. Нужна ли ему команда обновления или удаления?). Таким образом, мой GUESS состоит в том, что это инициирует обновление, и поэтому снова вызывает ваше событие и запуск метода рекурсивно.

Информация найдена в заметке на: Этот сайт с MSDN

Они дают ссылку на этот сайт для получения дополнительной информации. Может быть, вы найдете там свой ответ.

Что касается решения вашей проблемы, то, кажется, вы можете пропустить ваше событие и просто вызвать команду обновления. Я НЕ уверен в этом, потому что у меня нет времени, чтобы проверить это, и у меня мало опыта по этому вопросу.

Ну, надеюсь, это поможет тебе немного дальше ...

...