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



我有一个DataGridView,不会更新其内容后编程设置它的数据源。我已经验证了新数据是好的,并尝试了. refresh,将数据源设置为none和其他一些东西,以使其使用新数据重新绘制自己。我花了几个小时尝试各种事件的组合(甚至将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

基本上,另一个被打开的表单,在其表单中调用"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

成功!!我所知道的是,我所要做的就是在打开子窗体时使用ShowDialog()而不是Show(),这样当它关闭时,我只需要检查dialgresult。取消,然后从父类调用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()方法。

在if语句中刷新:

If calledfrompopup Then

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

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

最新更新