2012-11-07 28 views
1

我的vb.net 4.0项目是内部交易平台。DatagridView在更新时崩溃应用程序导致滚动条出现

称为MsgPad一个单独的形式含有一个DataGridView称为MsgPadDG

表单加载 sub做了两件事:格式化datagridview并为gridview刷新定义一个计时器。

第二子,UpdateMyMsg,通过NewMessage作为事件手段接收来自螺纹UIUpdaterEngine更新,并更新MyMessages对象(本质上是一个数据表)。

第三个子分区UpdateMdgPadDGW使用invoke方法更新/刷新datagridview(可能不是必须的,因为定时器是在UI线程中定义的)。

最后在DataGridView属性:行被定义为不用户可编辑的AutoSizeRowsMo​​de = Displayedcells滚动条=两个

我的问题是,当更新过程添加行超出datagridview的限制,导致滚动条出现时,整个应用程序崩溃。 我尝试了没有计时器(直接在UpdateMyMsg Sub中调用数据源更新),但是问题始终存在。 奇怪的事情:Try-Catch块没有捕捉任何东西。

预先感谢您的重播。

爱德华多

这里来了CODE:

Public Class MsgPad 
Private WithEvents _MyUIUpdaterEngine As MyUIUpdaterEngine = MyUIUpdaterEngine.Instance 
Private MyMessages As New Messages 
Private LastUpdate As DateTime = TimeValue("08:00:00") 
Private ObjLock As New Object 
Private NewMessages As Boolean = False 
Dim UpdateDGWTimer As New System.Timers.Timer 

Private Sub MsgPad_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
    Try 
     '-- 
     MsgPadDG.DataSource = MyMessages.DTable 
     '-- 
     With MsgPadDG 
      '-- 
      .Columns("Msg_ID").Visible = False 
      .Columns("I_CommandID").Visible = False 
      .Columns("B_ID").Visible = False 
      .Columns("F_ID").Visible = False 
      .Columns("T_TV").Visible = False 
      .Columns("T_Sign").Visible = False 
      .Columns("T_Mde").Visible = False 
      .Columns("T_QU").Visible = False 
      .Columns("T_QI").Visible = False 
      .Columns("T_QF").Visible = False 
      .Columns("T_PI").Visible = False 
      .Columns("T_PF").Visible = False 
      '-- 
      .Columns("Msg_RecDate").HeaderText = "Date" 
      .Columns("Msg_RecDate").Width = 50 
      .Columns("Msg_RecDate").DefaultCellStyle.Format = "HH:mm:ss" 
      .Columns("I_Symbol").HeaderText = "Symbol" 
      .Columns("I_Symbol").Width = 80 
      .Columns("I_Des").HeaderText = "Des" 
      .Columns("I_Des").Width = 180 
      .Columns("Msg_Text").HeaderText = "Message" 
      .Columns("Msg_Text").Width = 250 
      '-- 

     End With 

     '--Crea timer per l'Update del DAtagridView 
     AddHandler UpdateDGWTimer.Elapsed, AddressOf UpdateMsgPadDGW 
     UpdateDGWTimer.Interval = 3500 
     UpdateDGWTimer.Enabled = True 
..... 
..... 
End Sub 

Private Sub UpdateMyMsg(ByVal CRec As OrderRecord, ByVal Msg As String) Handles _MyUIUpdaterEngine.NewMessage 

    Try 
     SyncLock ObjLock 
      '--Aggiorna la tabella MyMessages 
      MyMessages.Add(CRec, Msg) 
      NewMessages = True 
      '--Parla messaggio 
      Dim synth As New SpeechSynthesizer 
      Dim TalkMsg As String = Msg 
      If CRec.I_Des <> Nothing Then TalkMsg += " su: " + CRec.I_Des 
      synth.SpeakAsync(TalkMsg) 
     End SyncLock 
..... 
..... 
End Sub 


Private Sub UpdateMsgPadDGW(source As Object, e As ElapsedEventArgs) 

    '--Aggiorna MesssagePad 
    Try 
     SyncLock ObjLock 
      If NewMessages Then 
       MsgPadDG.ControlInvoke(Sub(l) 
              MsgPadDG.DataSource = MyMessages.DTable 
              MsgPadDG.Refresh() 
              MsgPadDG.ClearSelection() 
             End Sub) 
       NewMessages = False 
      End If 
     End SyncLock 
..... 
..... 
End Sub 
+0

究竟是哪条线坠毁?或者是不可能通过它? – WozzeC

+0

很奇怪,try-catch没有捕获任何东西,错误没有记录。 我怀疑它绑定或刷新崩溃: ** MsgPadDG.ControlInvoke(Sub(l) MsgPadDG.DataSource = MyMessages。DTable MsgPadDG.Refresh() MsgPadDG.ClearSelection() 完子)** – Platypus

回答

1
 '--Aggiorna la tabella MyMessages 
     MyMessages.Add(CRec, Msg) 
     NewMessages = True 

这是一个致命的错误,在DGV势必MyMessages。因此,在工作线程中调用Add()会导致控件从错误的线程更新。您通常会从访问来自错误线程的控件获取IllegalOperationException,但不幸的是,它不适用于绑定数据。

您需要以不同的方式做到这一点,让工作人员将消息添加到List中。然后在被调用的代码中使用这些新消息更新MyMessages。

另请注意,您的计时器是而不是像您在问题中假设的那样安全的计时器。只有一个System.Windows.Forms.Timer是一个安全的,它的Tick事件处理程序将在UI线程上运行。那么你也不需要再调用了。

+0

汉斯, 非常感谢您的回复,并感谢您的教训。 我会尝试一下你给我的提示。 Edoardo – Platypus

相关问题