|
|
|
новичок
      
участник
Last Login: 22.02.2007 12:21
Сообщ.: 3,
Visits: 20
|
|
| подскажите,плиз,как быть в следующей ситуации - на форме есть список c кодом завода ,в зависимости от выбранной записи - соответствующие записи выводяться в DataGrid. проблема в следующем - не могу организовать удаление,редактирование и ввод новых, когда выводила всю таблицу организовывала удаление например так tbl.Rows(DataGrid1.CurrentRowIndex).Delete() передавала индекс выделенной записи,но ведь теперь это не реальная позиция записи в таблице,а только в DataGrid1.заранее спасибо Dim sMsg As String Dim nButton As Integer 'переменная для нажатой кнопки Dim nResult As Integer sMsg = "Видалити запис із словника?" nButton = vbYesNo + vbQuestion nResult = MsgBox(sMsg, nButton, "Видалення запису") If nResult = vbYes Then tbl.Rows(DataGrid1.CurrentRowIndex).Delete() DataGrid1.DataSource = tbl custCB = New OleDbCommandBuilder(dscmd) dscmd.Update(ds, "kod_pomol") tbl.AcceptChanges() DataGrid1.Refresh() End If End Sub
|
|
|
|
|
Forum Member
      
участник
Last Login: 27.02.2008 16:42
Сообщ.: 43,
Visits: 1 569
|
|
MeduzKa (24.01.2007) когда выводила всю таблицу организовывала удаление например так tbl.Rows(DataGrid1.CurrentRowIndex).Delete() передавала индекс выделенной записи,но ведь теперь это не реальная позиция записи в таблице,а только в DataGrid1.
Не сoвсем. Удaление в дaннoм случaе прoисхoдит в структуре DataTable, кoтoрaя является истoчникoм дaнных для DataGrid. Линия DataGrid1.Refresh() в кoде oтрaжaет этo изменение. Крoме тoгo, я бы предлoжил не пoлaгaться пoлнoстью нa пoзицию в DataGrid при этoй oперaции. Бoлее прaвильным будет пoлучить из DataGrid знaчеие ключевoгo пoля в DataTable для выделеннoй зaписи и прoизвoдить удaление нa oснoвaнии знaчения ключевoгo пoля. Кстaти, нaличие ключевoгo пoля (Primary Key) является неoбхoдимым услoвием для успешнoгo сoздaния клaссoм OleDbCommandBuilder кoмaнды нa изменение дaнных. Вoзмoжнo чтo у Вaс есть и другие прoблемы в кoде. Нaпример, из приведеннoгo кoдa не виднo чтo тaкoе dscmd (этo дoлжен бытъ DataAdapter, кoтoрый был сoздaн при зaпoлнении DataTable); кaкaя SelectCommand испoльзoвaлaсь при сoзaдaнии DataAdapter, не включaлa-ли этa кoмaндa пoля из нескoльких тaблиц; Не был-ли зaкрыт DataAdapter дo испoлнения кoдa custCB = New OleDbCommandBuilder(dscmd); не был-ли изменен текст SelectCommand пoсле сoздaния DataAdapter; и тaк дaлее. Сaмaя-же oснoвнaя прoблемa в приведеннoм кoде - oтсутствие error handling. Нaчните с этoгo.
|
|
|
|
|
Forum Guru
      
участник
Last Login: 06.01.2008 10:33
Сообщ.: 70,
Visits: 678
|
|
| Для определения "правильной" строки (иногда пользователь может выполнить сортировку например и индексы перемешиваются) нужно воспользоваться BindingContext.
|
|
|
|
|
новичок
      
участник
Last Login: 22.02.2007 12:21
Сообщ.: 3,
Visits: 20
|
|
| а нельзя ли маленький пример?сама никак не могу разобраться..
|
|
|
|
|
Forum Guru
      
участник
Last Login: 06.01.2008 10:33
Сообщ.: 70,
Visits: 678
|
|
Что-то типа этого: Private Sub Init() 'Инициализация формы, заполнение таблиц данными '.................. DataGrid1.DataSource = ds.MyTable End Sub Private Sub DeleteRow() If MessageBox.Show("Видалити запис із словника?", "Видалення запису", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then Dim currow As DataRow = CType(Me.BindingContext.Item(ds.MyTable).Current, DataRow) currow.Delete() 'Тут вызываем DataAdapter.Update для отправки изменений в БД dscmd.Update(ds, "kod_pomol") End If End Sub
|
|
|
|