DataGridView не обновляется после обновления набора данных vb.net

У меня есть форма vb.net с dataGridView

Источником данных dataGridView является dgvTableAdapter с этим оператором sql.

SELECT membres.ID, membres.refere_par, bands.titre, 
       membres_1.prenom & ' ' & membres_1.nom  AS reference_nom
FROM ((bands INNER JOIN membres ON bands.ID = membres.[band]) 
      INNER JOIN membres membres_1 ON membres.refere_par = membres_1.ID)

Я удаляю членов из таблицы членов, как это

' Get member id 
Dim userId As Integer 
userId = DataGridView1.Item( 0,0).Value

' Delete the member
Me.MeoshowDataSet2.membres.FindByID(userId).Delete()
Me.MembresTableAdapter.Update(Me.MeoshowDataSet2)

' Refresh datagrid
dataGridView1.Refresh() ' does nothing

Я знаю, что оператор удаления работает, потому что я видел изменения в базе данных. Если я закрою форму и снова открою ее, dataGridView будет обновлен.

Таблица членов является таблицей доступа.

Я запускаю приложение в режиме отладки Visual 2010.


person pec    schedule 13.04.2012    source источник


Ответы (5)


Обычный способ сделать это — сбросить DataSource из DataGridView.

Попробуйте использовать этот код (с правильным кодом, чтобы предоставить правильную таблицу из набора данных):

dataGridView1.DataSource = typeof(List); 
dataGridView1.DataSource = dataset.Tables["your table"];

Вызов .Refresh() не работает, так как он только вызывает перерисовку, но код, который рисует сетку, не знает об изменениях.

person David Hall    schedule 13.04.2012
comment
Я не использовал dataGridView1.DataSource = typeof(List); но переназначение набора данных сработало. Спасибо! - person pec; 13.04.2012
comment
Я думаю, вам нужно - это та часть, которая устраняет проблему! По сути, вам нужно очистить источник данных — вы можете установить для источника данных значение null, но использование typeof (List) сохранит автоматически сгенерированные столбцы. Но если и без этого работает, то отлично :) - person David Hall; 13.04.2012
comment
Я использовал dataGridView1.Datasouce = Ничего - person pec; 13.04.2012
comment
Ах да, примерно то же самое (забыл, что вы работали в vb.net). - person David Hall; 13.04.2012
comment
Нельзя ли также решить эту проблему с помощью BindingSource, чтобы уведомить DGV об изменениях в DataTable? - person Origin; 13.04.2012
comment
@Origin Я видел, как BindingSource работает и не работает - это то, что я обычно пробую в первую очередь (и, вероятно, здесь есть несколько ответов, предлагающих это), и я, честно говоря, не уверен на 100%, когда он будет работать или не будет работать. - person David Hall; 13.04.2012
comment
@Origin Я, кажется, помню, что часть проблемы заключается в том, что некоторые источники данных просто никому не говорят, что они изменились (они не вызывают событие изменения списка), поэтому вам не повезло - ДАЖЕ когда вы знаете, что список изменился. Одним из решений является использование источника привязки и указание ему вызвать это событие. Последний раз сталкивался с этим с Oracle TableAdapter, не могу вспомнить, ведут ли другие себя таким же раздражающим образом. - person David Hall; 13.04.2012
comment
Последний комментарий @Origin - только что просмотрел ваши ответы и увидел тот, в котором вы выступаете за BindingList‹T› над адаптерами таблиц. Это именно то, что я тоже делаю по причинам, подобным этой проблеме - я нахожу использование BindingList очень простым по сравнению с адаптерами таблиц. - person David Hall; 13.04.2012

Я наткнулся на это, когда искал точно такую ​​​​же проблему. Хотя в сети не нашел. Вот что сработало для меня:

Public Sub RefreshData()
    dTable.Clear()
    dAdapter.Fill(dTable)
    dtaDataGrid.DataSource = dTable
End Sub

Private Sub btnRefresh_Click(sender As System.Object, e As System.EventArgs) Handles btnRefresh.Click
    RefreshData()

    ClearAllTextBox(Me)
End Sub

Сначала очистил все данные в таблице данных, а затем снова заполнил ее данными из адаптера данных, поскольку вы сказали, что база данных была обновлена ​​​​с вашим кодом, но она не обновлялась.

person Tim    schedule 22.02.2013
comment
спасибо, это сработало и для меня. Сброс источника данных в ничто просто шифрует мою сетку данных, потому что у меня есть DataPropertyName, установленный для каждого столбца. Ваше предложение работает идеально! - person LuckyLuke82; 09.12.2016

Вы также можете использовать это:

DirectCast(dataGridView1.DataSource, DataTable).AcceptChanges()

Просто замените dataGridView1. Второй параметр — это класс DataTable.

person AlexVMM    schedule 16.01.2013

... и альтернатива, которая сработала для меня:

'reset datasource

dgvBHL.DataSource = nothing

' Assign datatable to dgv this always works 1st time it is called

dgvBHL.DataSource = dtData 

'To fix the DGV not refreshing properly after the 1st time, switch the sort order

dgvBHL.Sort(dgvBHL.Columns(0), System.ComponentModel.ListSortDirection.Descending)

dgvBHL.Sort(dgvBHL.Columns(0), System.ComponentModel.ListSortDirection.Ascending)

'No need to do a refresh or anything else
person Kristian    schedule 14.02.2014

Я просто добавил эту строку:

    Me.EmpTableAdapter.Fill(Me.MyDbDataSet1.Emp)
person Sami Alkendi    schedule 02.03.2021