以编程方式更改数据源后,Winform DataGridView未刷新

时间:2015-08-03 08:41:58

标签: c# .net vb.net winforms datagridview

我有一个DataGridView,在以编程方式设置数据源后不会更新其内容。我已经验证了新数据很好,并尝试了.Refresh,将数据源设置为空,还有一些其他的东西让它用新数据重绘自己。我花了好几个小时尝试各种事件组合(甚至将DotNet框架降级到3.5以查看它是否是4.5框架中的错误)以及其他论坛的技巧。什么都行不通。

Public Sub GetNewOrders(Optional calledfrompopup As Boolean = False)
    Me.dgvOrders.DataSource = QBI.Order_DataICT.GetNewOrdersICT()
    If calledfrompopup Then
        ''100% certain that the datasource info has changed, yet datagridview just won't reflect the change!
        Me.pnlOrders.Refresh() 'does not work
        Me.dgvOrders.Refresh() 'does not work
    End If
End Sub

基本上,另一个打开的表单在其form.closing事件中调用“GetNewOrders”,然后关闭。调用表单有上面的方法,并检查是否需要刷新datagridview(我认为这个解决方案可行,但是,唉,它没有)。 正如您所看到的,我已尝试刷新datagridview所在的面板(以及表单本身)。刷新什么都不做,没有重绘或重新绑定或任何我能找到的东西会强制datagridview重新加载自己。 难倒! C#或VB.Net语言的答案都可以。

该功能的另一个版本显示了我尝试过的其他内容

Public Sub GetNewOrders(Optional calledfrompopup As Boolean = False)
    Me.dgvOrders.DataSource = Nothing 'does not work
    Me.dgvOrders.DataMember = "" 'does not work
    Me.dgvOrders.DataSource = QBI.Order_DataICT.GetNewOrdersICT() '100% certain that the datasource info has changed, yet datagridview just won't reflect the change!

    If calledfrompopup Then
        Me.pnlOrders.Refresh() 'does not work
        Me.dgvOrders.Refresh() 'does not work
        Me.dgvOrders.Show() 'does not work
        Me.dgvOrders.Visible = False 'does not work
        Me.dgvOrders.Visible = True 'does not work
    End If
End Sub

2 个答案:

答案 0 :(得分:1)

成功!!我想到的是我所要做的就是在打开子窗体时使用ShowDialog()而不是Show(),这样当它关闭时,我只需要检查DialogResult.Cancel,然后从中调用函数GetNewOrders父母如:

   Dim frm2 As New frmSendToQuickbooksPopup
    frm2.CurrentOrder = Order
    frm2.lineitems = OrdLineItems
    frm2.payments = OrdPayments
    Dim diaResult As DialogResult = frm2.ShowDialog() 
    If diaResult = Windows.Forms.DialogResult.Cancel Then
        GetNewOrders()
    End If

要解释:frm2已打开,当它关闭时,datagridview(在父窗体上)现在看到它已关闭并调用方法GetNewOrders()。

答案 1 :(得分:0)

你在if语句中刷新:

If calledfrompopup Then

确保你传递的是真的并且你正在那里。接下来,而不是刷新只是在if语句中设置数据源:

If calledfrompopup Then
    //The use of "Me" here may not be necessary.
    Me.dgvOrders.DataSource = QBI.Order_DataICT.GetNewOrdersICT()