обновить набор данных, используя соединения и bindingsource? - PullRequest
0 голосов
/ 06 августа 2009

Я создал набор данных, и в конструкторе я создал отношения и внешние ключи, которые существуют в базе данных. По сути, у меня есть продукт, который имеет отношение к таблице цен. Ключевое поле, которое они разделяют, это IdProduct в таблице цен. В поле «Заполнить / получить товар» я возвращаю поле «Цена».

У меня также есть DataGrid, который использует BindingSource, который использует эту таблицу. Все отображается правильно, и когда я дважды щелкаю строку в сетке данных, я открываю форму с вкладками, которая содержит подробный вид выбранной записи.
Пользователь в этот момент может вносить изменения в записи, и они должным образом распространяются обратно на BindingSource. Проблема в том, что TableAdapter не содержит обновления appopriate, поэтому я не могу вызвать метод TableAdapter.Update с набором данных, как если бы я создал Tableadapter, не используя соединение.

Как мне лучше справиться с этой ситуацией?

В то же время я не могу получить измененную строку:

       dTiendasDs.ProductosDataTable modified = (dTiendasDs.ProductosDataTable)
dTiendasDs.Productos.GetChanges(DataRowState.Modified);

изменено всегда равно нулю

Спасибо

Ответы [ 2 ]

0 голосов
/ 07 августа 2009

Я не нашел решения, которое бы меня полностью устраивало.

Я не знаю, как сделать метод обновления в одном, чтобы две мои таблицы, которые «соединены» (внутреннее соединение) в наборе данных, обновлялись одновременно.

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

Мой код, наконец, следующий.

this.productosBindingSource.EndEdit ();

        dTiendasDs.Productos[0].idZona =

Convert.ToInt32 (zonasCombobox.SelectedValue);

        dTiendasDs.Productos[0].Precio =

Convert.ToDouble (this.precioTextBox.Text);

        dTiendasDs.Productos[0].EndEdit();


        if (dTiendasDs.HasChanges())
        {
            this.productosTableAdapter.UpdateData(dTiendasDs.Productos[0]["nombre"].ToString(),
                Convert.ToInt32(dTiendasDs.Productos[0]["idZona"]),Convert.ToInt32(dTiendasDs.Productos[0]["idProducto"]));

            this.preciosTableAdapter.UpdateData(
                Convert.ToInt32(dTiendasDs.Productos[0]["idProducto"]),
                Convert.ToDouble(dTiendasDs.Productos[0]["precio"]),IdTienda);
        }

        this.dTiendasDs.AcceptChanges();
0 голосов
/ 06 августа 2009

Лично я всегда делаю foreach во всех рядах ..
Затем в строке я проверяю свойство Row.RowState .

ВНИМАНИЕ! ВСЕГДА ВЫЗЫВАЙТЕ Row.EndEdit () перед запросом состояния строки, поскольку в противном случае жесткие значения изменились, состояние строки не изменилось .. (возможно, это была ваша первоначальная проблема).

Если без изменений -> ничего
Если удалено -> удалить заявление
если изменено -> обновить оператор
если добавлено -> вставить оператор

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

object o1 = pRow[fCol, DataRowVersion.Current];
object o2 = pRow[fCol, DataRowVersion.Original];


Надеюсь, этого достаточно, чтобы вы пошли.

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