datagridview не обновляется до связанного источника данных

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

Вот моя привязка:

Private _dgbNews As SortableBindingList(Of SalesMessageRecord)

Private Sub SalesMessageScreen_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  '_dgbNews.RaiseListChangedEvents = True
  _dgbNews = AllNews()
  BindingSource1.DataSource = AllNews()
  DataGridView1.DataSource = BindingSource1
  MassageDemRows()
End Sub

это AllNews():

Public Function AllNews() As SortableBindingList(Of SalesMessageRecord)

  Dim sm = New SortableBindingList(Of SalesMessageRecord)
  Dim allnewsitems = News.GetAllNewsItems(Configuration.CompanyID).ToList()

  For Each allnewz As News In allnewsitems
    Dim smr = New SalesMessageRecord
    smr.Body = allnewz.NewsBody
    smr.CorporationId = CType(allnewz.CorporationId, Guid)
    smr.Expiration = allnewz.Expiration
    smr.IsActive = allnewz.IsActive
    smr.NewsId = allnewz.NewsId
    smr.Title = allnewz.NewsTitle
    smr.SortOrder = allnewz.OrderNumber
    smr.TokenId = allnewz.TokenId
    smr.IsNew = False
    sm.Add(smr)
  Next

  Return sm

End Function

И вот где я пытаюсь обновить его:

Private Sub button_Save_Click(sender As System.Object, e As System.EventArgs) Handles button_Save.Click
  If _currentRow < 0 Then
    Return
  End If

  _dgbNews(_currentRow).Expiration = datetimepicker_ExpirationDate.Value
  _dgbNews(_currentRow).SortOrder = CInt(numericupdown_SortNumber.Value)
  _dgbNews(_currentRow).IsActive = checkbox_Active.Checked
  _dgbNews(_currentRow).Body = richtextbox_Body.Text
  _dgbNews(_currentRow).Title = textbox_Title.Text

  DataGridView1.Refresh()

  News.UpdateNewsRecord(_dgbNews(_currentRow).NewsId,
                        _dgbNews(_currentRow).Expiration,
                        _dgbNews(_currentRow).SortOrder,
                        _dgbNews(_currentRow).IsActive,
                        _dgbNews(_currentRow).Body,
                        _dgbNews(_currentRow).Title)
End Sub

База данных обновляется без проблем, но datagridview не обновляется.


person ErocM    schedule 29.01.2013    source источник
comment
Почему вы обновляете сетку данных перед выполнением News.UpdateNewsRecord? Попробуйте: stackoverflow .com/questions/2580053/   -  person JeffO    schedule 29.01.2013
comment
News.UpdateNewsRecord обновляет мою базу данных. Это не должно влиять на datagridview. Кроме того, я изменил его, чтобы не использовать BindingSource, но это не имело никакого значения.   -  person ErocM    schedule 29.01.2013


Ответы (4)


Хорошо, я возьму трещину на этом. Источники привязки действительно полезны при использовании вместе с DGV. Тем не менее, они, как правило, ужасны тем, что не дают никакой информации о том, почему они не работают.

Прежде всего, я бы сказал, что ваш источник привязки имеет неправильный источник данных.

_dgbNews = AllNews()
BindingSource1.DataSource = AllNews()
DataGridView1.DataSource = BindingSource1

Как вы можете видеть, у вас есть AllNews() в качестве источника данных. Но вы добавляете что-то в _dgbNews и ожидаете, что Allnews() изменится. Протип, это не так. Если бы вы установили DataSource на это:

BindingSource1.DataSource = _dgbNews

Тогда, по крайней мере, вы должны ожидать каких-то изменений при обновлении списка. Теперь это то, что вы на самом деле скучаете. При нажатии кнопки «Сохранить» вы добавляете элемент в список, теперь это нормально, если вы сделали вышеописанное. Но подождите, источник данных изменился, и ничего не произошло. Это связано с тем, что вы не сообщаете datagridview об изменении. Заставьте Bindingsource сообщать обо всем, к чему он подключен, для обновления. С этим:

BindingSource1.ResetBindings(True) 

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

Попробуйте это и посмотрите, станет ли это лучше.

person WozzeC    schedule 30.01.2013

Была аналогичная проблема с DataGridView, не отображающей никаких данных из моего источника данных, выяснилось, что мои свойства класса привязки были обычными int или string вместо того, чтобы быть объявленными с помощью get set.

изменено с

инт. RedeemID;

to

общественный интервал RedeemID { получить; задавать; }

person Harry    schedule 07.10.2013

ПОПРОБУЙ ЭТО:

(ПОСЛЕ ВЫПОЛНЕНИЯ КОМАНДЫ ОБНОВЛЕНИЯ ОТ АДАПТЕРА ДАННЫХ)

GRIDVIEW_NAME.DATABIND()
person SHRI    schedule 28.04.2014

Me.TableAdapter1.Fill(Me.DataSet1.Table1)

person Hanna Khoury    schedule 19.09.2014
comment
Хотя теоретически это может ответить на вопрос, было бы предпочтительнее объяснить, как ваш код решает вопрос. - person Pred; 19.09.2014