使用BackGroundWorker内部的值更新DataGridView [英] Updating DataGridView with values from inside BackGroundWorker
问题描述
嗨!
我有一个不断发展壮大的计划。 过去需要3秒才能运行,但经过多年的多次更新后,现在需要2分钟才能运行。 我决定将所有繁重的工作转移到后台工作人员并更新标签,以便用户可以看到发生了某些事情并且程序没有被冻结。 这很好。
我遇到问题的部分是在程序结束时更新datagridvivew以显示结果。 我理解GUI和后台工作者在不同的线程上,所以我需要找到一种方法来从一个线程到另一个线程获取信息。
这些年来我多次尝试这样做(是的,YEARS!),但是永远无法让它工作,没有人在抱怨(它真的让我感到烦恼!)。 经过多次尝试后我才放弃,直到现在。 我需要让它工作,所以我达到了
out :))
这是运行程序后datagridview的样子:
背景工作者:
Private WithEvents bgw As New System.ComponentModel.BackgroundWorker
这是代码。 有13个单独的进程调用它们执行不同的计算。 所有结果都存储在列表中。 最后,我调用该过程将信息传输到DGV:
Dim thisNPMarginal As New NP_Marginal
Dim SecondNPMarg As Boolean = False
Newspaper_Marginals(thisNPMarginal,SecondNPMarg)
Dim thisRAMarginal As New RA_Marginal
Dim SecondRAMarg As Boolean = False
Radio_Marginals(thisRAMarginal,SecondRAMarg)
Dim thisTVMarginal As New TV_Marginal
Dim SecondTVMarg As Boolean = False
TV_Marginals(thisTVMarginal,SecondTVMarg)
Dim thisMTMarginal As New MT_Marginal
Dim SecondMTMarg As Boolean = False
MT_Marginals(thisMTMarginal,SecondMTMarg)
Dim thisMMMarginal As New MM_Marginal
Dim SecondMMMarg As Boolean = False
MM_Marginals(thisMMMarginal,SecondMMMarg)
Dim thisINMarginal As New IN_Marginal
Dim Second INMarg As Boolean = False
IN_Marginals(thisINMarginal,SecondINMarg)
Dim thisECMarginal As New EC_Marginal
Dim SecondECMarg As Boolean = False
EC_Marginals(thisECMarginal,SecondECMarg)
Dim thisDGMarginal As New DG_Marginal
Dim SecondDGMarg As Boolean = False
DG_Marginals(thisDGMarginal,SecondDGMarg)
Dim thisEQMarginal As New EQ_Marginal
Dim SecondEQMarg As Boolean = False
EQ_Marginals(thisEQMarginal,SecondEQMarg)
Dim thisESMarginal As New ES_Marginal
Dim SecondESMarg As Boolean = False
ES_Marginals(thisESMarginal,SecondESMarg)
Dim thisTXTMarginal As New TXT_Marginal
Dim SecondTXTMarg As Boolean = False
TXT_Marginals(thisTXTMarginal,SecondTXTMarg)
Dim thisGSMarginal As New GS_Marginal
Dim SecondGSMarg As布尔= Fa lse
GS_Marginals(thisGSMarginal,SecondGSMarg)
Dim thisHHIMarginal As New HHI_Marginal
Dim SecondHHIMarg As Boolean = False
HHI_Marginals(thisHHIMarginal,SecondHHIMarg)
Populate_MarginalDGV(thisNPMarginal,thisRAMarginal,thisTVMarginal,thisMTMarginal,
thisMMMarginal,thisINMarginal,thisECMarginal,thisDGMarginal,thisEQMarginal,
thisESMarginal,thisTXTMarginal,thisGSMarginal,thisHHIMarginal)
这是我调用加载datagridview的过程的代码。 所以我认为*这是我需要弄清楚如何从backgroundworker做的部分或者我应该将我需要的值传递回主线程并在那里进行吗?
Private Sub Populate_MarginalDGV(ByVal thisNPMarginal,ByVal thisRAMarginal,ByVal thisTVMarginal,ByVal thisMTMarginal,ByVal thisMMMarginal,_
ByVal thisINMarginal,ByVal thisECMarginal,ByVal thisDGMarginal,ByVal thisEQMarginal,ByVal thisESMarginal,_
ByVal thisTXTMarginal,ByVal thisGSMarginal,ByVal thisHHIMarginal)
dgv_MARGINALS.Rows.Add(" 1",thisNPMarginal.NP1,thisRAMarginal.RA1,thisTVMarginal.TV1,thisMTMarginal。 MT1,_
thisMMMarginal.MM1,thisINMarginal.IN1,thisECMarginal.EC1,thisDGMarginal.DG1,_
thisEQMarginal.EQ1,thisESMarginal.ES1,thisTXTMarginal.TXT1,thisGSMarginal.GS1, thisHHIMarginal.HHI1)
dgv_MARGINALS.Rows.Add(" 2",thisNPMarginal.NP2,thisRAMarginal.RA2,thisTVMarginal.TV2,thisMTMarginal.MT2,_
thisMMMarginal.MM2,thisINMarginal.IN2,thisECMarginal。 EC2,thisDGMarginal.DG2,_
thisEQMarginal.EQ2,thisESMarginal.ES2,thisTXTMarginal.TXT2,thisGSMarginal.GS2,thisHHIMarginal.HHI2)
dgv_MARGINALS.Rows.Add(" 3",thisNPMarginal.NP3, thisRAMarginal.RA3,thisTVMarginal.TV3,thisMTMarginal.MT3,_
thisMMMarginal.MM3,thisINMarginal.IN3,thisECMarginal.EC3,thisDGMarginal.DG3,_
thisEQMarginal.EQ3,thisESMarginal.ES3,thisTXTMarginal.TXT3, thisGSMarginal.GS3,thisHHIMarginal.HHI3)
dgv_MARGINALS.Rows.Add(" 4",thisNPMarginal.NP4,thisRAMarginal.RA4,thisTVMarginal.TV4,thisMTMarginal.MT4,_
thisMMMarginal.MM4,thisINMarginal.IN4,thisECMarginal.EC4,thisDGMarginal.DG4,_
thisEQMarginal.EQ4,thisESMarginal.ES4,thisTXTMarginal.TXT4,thisGSMarginal.GS4,thisHHIMarginal.HHI4)
dgv_MARGINALS.Rows.Add ("5",thisNPMarginal.NP5,thisRAMarginal.RA5,thisTVMarginal.TV5,thisMTMarginal.MT5,_
thisMMMarginal.MM5,thisINMarginal.IN5,thisECMarginal.EC5,thisDGMarginal.DG5,_
thisEQMarginal。 EQ5,thisESMarginal.ES5,thisTXTMarginal.TXT5,thisGSMarginal.GS5,thisHHIMarginal.HHI5)
with dgv_MARGINALS
.Enabled = True
.AlternatingRowsDefaultCellStyle.BackColor = Color.LightBlue
.Columns(0).Width = 25
.Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(1).DefaultCellStyle.Alignment = DataGridViewContent Alignment.MiddleCenter
.Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(4).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(5).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(6).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(7).DefaultCellStyle。 Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(8).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(9).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(10).DefaultCellStyle .Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(11).DefaultCellStyle.Alignment = DataGridViewConte ntAlignment.MiddleCenter
.Columns(12).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(13).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
End with
结束子
我有13自定义类(每个包含5个变量)和每个类的列表。 所有都是全局定义并存储DGV的数据:
私有类NP_Marginal
Public NP1 As String =" - - "
Public NP2 As String =" - "
Public NP3 As String =" - "
Public NP4 As String =" - "
Public NP5 As String =" - "
结束类
私有类RA_Marginal
Public RA1 As String =" - "
Public RA2 As String =" - "
Public RA3 As String =" - "
Public RA4 As String =" - "
Public RA5 As String =" - "
结束等级
私人等级TV_Marginal
Public TV1 As String =" - "
Public TV2 As String =" - "
Public TV3 As String =" - "
Public TV4 As String =" - "
Public TV5 As String =" - "
结束类
私有类MT_Marginal
Public MT1 As String =" - "
Public MT2 As String =" - "
Public MT3 As String =" - "
Public MT4 As String =" - "
Public MT5 As String =" - "
结束等级
私有等级MM_Marginal
公共MM1为字符串=" - "
Public MM2 As String =" - "
Public MM3 As String =" - "
Public MM4 As String =" - "
Public MM5 As String =" - "
结束类
私有类IN_Marginal
Public IN1 As String =" - "
Public IN2 As String =" - "
Public IN3 As String =" - "
Public IN4 As String =" - "
Public IN5 As String =" - "
结束类
私有类EC_Marginal
Public EC1 As String =" - "
Public EC2 As String =" - "
Public EC3 As String =" - "
Public EC4 As String =" - "
Public EC5 As String =" - "
结束等级
私有等级DG_Marginal
Public DG1 As String =" - "
Public DG2 As String =" - "
Public DG3 As String =" - "
Public DG4 As String =" - "
Public DG5 As String =" - "
结束等级
私有等级EQ_Marginal
Public EQ1 As String =" - "
Public EQ2 As String =" - "
Public EQ3 As String =" - "
Public EQ4 As String =" - "
Public EQ5 As String =" - "
结束类
私有类ES_Marginal
Public ES1 As String =" - "
Public ES2 As String =" - "
Public ES3 As String =" - "
Public ES4 As String =" - "
Public ES5 As String =" - "
结束类
私有类TXT_Marginal
Public TXT1 As String =" - "
Public TXT2 As String =" - "
Public TXT3 As String =" - "
Public TXT4 As String =" - "
Public TXT5 As String =" - "
结束类
私有类GS_Marginal
公共GS1 As String =" - "
Public GS2 As String =" - "
Public GS3 As String =" - "
Public GS4 As String =" - "
Public GS5 As String =" - "
结束等级
私有等级HHI_Marginal
公共HHI1 As String =" - "
Public HHI2 As String =" - "
Public HHI3 As String =" - "
Public HHI4 As String =" - "
Public HHI5 As String =" - "
结束类
私有NPMarginalList作为新列表(NP_Marginal)
私有RAMarginalList作为新列表(Of RA_Marginal)
私有TVMarginalList作为新列表(Of TV_Marginal)
Private MTMarginalList As New List(Of MT_Marginal)
Private MMMarginalList As New List(Of MM_Marginal)
Private INMarginalList As New List(Of IN_Marginal)
Private ECMarginalList As New List(Of EC_Marginal) )
私人DGMarginal列为新列表(Of DG_Marginal)
私有EQMarginal列为新列表(Of EQ_Marginal)
私有ESMarginal列为新列表(Of ES_Marginal)
私有TXTMarginal列为新列表( TXT_Marginal)
私有GSMarginalList为新列表(Of GS_Marginal)
私有HHIMarginalList为新列表(Of HHI_Marginal)
非常感谢任何帮助!它让我疯了!
如果有人能告诉我如何填充一行,我可以弄清楚剩下的一行。
我一直在我的程序中移动这么多东西,我担心我会破坏它并忘记如何
把它放回去......
TIA !!!
Joni
Hello Joni,
我有两种不同的模式,既不从类加载DataGridView,而是使用后端数据库,通过DataTable将行加载到DataGridView中其他通过类实例。
上面提到的第一个使用与
Hi!
I have a program that keeps growing and growing. It used to take 3 seconds to run, but after many updates over the years, it now takes over 2 minutes to run. I decided to move all the heavy lifting to a backgroundworker and update a label so the user can see that something is happening and the program isn't frozen. That works fine.
The part I'm having trouble with is updating a datagridvivew at the end of the program to display the results. I understand the GUI and backgroundworker are on different threads so I need to find a way to get the info from one thread to the other. I've tried to do this several times over the years (yes, YEARS!) but could never get it to work and noone was complaining (it just really bothered me!). So after many attempts I just gave up, until now. I need to get this to work so I'm reaching out :)
This is how the datagridview looks after running the program:
Backgroundworker:
Private WithEvents bgw As New System.ComponentModel.BackgroundWorker
This is the code. There are 13 separate processes called that perform different calculations. All results are stored in lists. At the end, I call the process to transfer the info to DGV:
Dim thisNPMarginal As New NP_Marginal Dim SecondNPMarg As Boolean = False Newspaper_Marginals(thisNPMarginal, SecondNPMarg) Dim thisRAMarginal As New RA_Marginal Dim SecondRAMarg As Boolean = False Radio_Marginals(thisRAMarginal, SecondRAMarg) Dim thisTVMarginal As New TV_Marginal Dim SecondTVMarg As Boolean = False TV_Marginals(thisTVMarginal, SecondTVMarg) Dim thisMTMarginal As New MT_Marginal Dim SecondMTMarg As Boolean = False MT_Marginals(thisMTMarginal, SecondMTMarg) Dim thisMMMarginal As New MM_Marginal Dim SecondMMMarg As Boolean = False MM_Marginals(thisMMMarginal, SecondMMMarg) Dim thisINMarginal As New IN_Marginal Dim SecondINMarg As Boolean = False IN_Marginals(thisINMarginal, SecondINMarg) Dim thisECMarginal As New EC_Marginal Dim SecondECMarg As Boolean = False EC_Marginals(thisECMarginal, SecondECMarg) Dim thisDGMarginal As New DG_Marginal Dim SecondDGMarg As Boolean = False DG_Marginals(thisDGMarginal, SecondDGMarg) Dim thisEQMarginal As New EQ_Marginal Dim SecondEQMarg As Boolean = False EQ_Marginals(thisEQMarginal, SecondEQMarg) Dim thisESMarginal As New ES_Marginal Dim SecondESMarg As Boolean = False ES_Marginals(thisESMarginal, SecondESMarg) Dim thisTXTMarginal As New TXT_Marginal Dim SecondTXTMarg As Boolean = False TXT_Marginals(thisTXTMarginal, SecondTXTMarg) Dim thisGSMarginal As New GS_Marginal Dim SecondGSMarg As Boolean = False GS_Marginals(thisGSMarginal, SecondGSMarg) Dim thisHHIMarginal As New HHI_Marginal Dim SecondHHIMarg As Boolean = False HHI_Marginals(thisHHIMarginal, SecondHHIMarg) Populate_MarginalDGV(thisNPMarginal, thisRAMarginal, thisTVMarginal, thisMTMarginal, thisMMMarginal, thisINMarginal, thisECMarginal, thisDGMarginal, thisEQMarginal, thisESMarginal, thisTXTMarginal, thisGSMarginal, thisHHIMarginal)
This is the code for the process I call to load the datagridview. So I *think* this is the part I need to figure out how to do from backgroundworker OR should I pass the values I need back to the main thread and do it there?
Private Sub Populate_MarginalDGV(ByVal thisNPMarginal, ByVal thisRAMarginal, ByVal thisTVMarginal, ByVal thisMTMarginal, ByVal thisMMMarginal, _ ByVal thisINMarginal, ByVal thisECMarginal, ByVal thisDGMarginal, ByVal thisEQMarginal, ByVal thisESMarginal, _ ByVal thisTXTMarginal, ByVal thisGSMarginal, ByVal thisHHIMarginal) dgv_MARGINALS.Rows.Add("1", thisNPMarginal.NP1, thisRAMarginal.RA1, thisTVMarginal.TV1, thisMTMarginal.MT1, _ thisMMMarginal.MM1, thisINMarginal.IN1, thisECMarginal.EC1, thisDGMarginal.DG1, _ thisEQMarginal.EQ1, thisESMarginal.ES1, thisTXTMarginal.TXT1, thisGSMarginal.GS1, thisHHIMarginal.HHI1) dgv_MARGINALS.Rows.Add("2", thisNPMarginal.NP2, thisRAMarginal.RA2, thisTVMarginal.TV2, thisMTMarginal.MT2, _ thisMMMarginal.MM2, thisINMarginal.IN2, thisECMarginal.EC2, thisDGMarginal.DG2, _ thisEQMarginal.EQ2, thisESMarginal.ES2, thisTXTMarginal.TXT2, thisGSMarginal.GS2, thisHHIMarginal.HHI2) dgv_MARGINALS.Rows.Add("3", thisNPMarginal.NP3, thisRAMarginal.RA3, thisTVMarginal.TV3, thisMTMarginal.MT3, _ thisMMMarginal.MM3, thisINMarginal.IN3, thisECMarginal.EC3, thisDGMarginal.DG3, _ thisEQMarginal.EQ3, thisESMarginal.ES3, thisTXTMarginal.TXT3, thisGSMarginal.GS3, thisHHIMarginal.HHI3) dgv_MARGINALS.Rows.Add("4", thisNPMarginal.NP4, thisRAMarginal.RA4, thisTVMarginal.TV4, thisMTMarginal.MT4, _ thisMMMarginal.MM4, thisINMarginal.IN4, thisECMarginal.EC4, thisDGMarginal.DG4, _ thisEQMarginal.EQ4, thisESMarginal.ES4, thisTXTMarginal.TXT4, thisGSMarginal.GS4, thisHHIMarginal.HHI4) dgv_MARGINALS.Rows.Add("5", thisNPMarginal.NP5, thisRAMarginal.RA5, thisTVMarginal.TV5, thisMTMarginal.MT5, _ thisMMMarginal.MM5, thisINMarginal.IN5, thisECMarginal.EC5, thisDGMarginal.DG5, _ thisEQMarginal.EQ5, thisESMarginal.ES5, thisTXTMarginal.TXT5, thisGSMarginal.GS5, thisHHIMarginal.HHI5) With dgv_MARGINALS .Enabled = True .AlternatingRowsDefaultCellStyle.BackColor = Color.LightBlue .Columns(0).Width = 25 .Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter .Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter .Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter .Columns(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter .Columns(4).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter .Columns(5).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter .Columns(6).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter .Columns(7).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter .Columns(8).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter .Columns(9).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter .Columns(10).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter .Columns(11).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter .Columns(12).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter .Columns(13).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter End With End Sub
I have 13 custom classes (each with 5 variables) and a list for each class. All are defined globally and store the data for the DGV:
Private Class NP_Marginal Public NP1 As String = "--" Public NP2 As String = "--" Public NP3 As String = "--" Public NP4 As String = "--" Public NP5 As String = "--" End Class Private Class RA_Marginal Public RA1 As String = "--" Public RA2 As String = "--" Public RA3 As String = "--" Public RA4 As String = "--" Public RA5 As String = "--" End Class Private Class TV_Marginal Public TV1 As String = "--" Public TV2 As String = "--" Public TV3 As String = "--" Public TV4 As String = "--" Public TV5 As String = "--" End Class Private Class MT_Marginal Public MT1 As String = "--" Public MT2 As String = "--" Public MT3 As String = "--" Public MT4 As String = "--" Public MT5 As String = "--" End Class Private Class MM_Marginal Public MM1 As String = "--" Public MM2 As String = "--" Public MM3 As String = "--" Public MM4 As String = "--" Public MM5 As String = "--" End Class Private Class IN_Marginal Public IN1 As String = "--" Public IN2 As String = "--" Public IN3 As String = "--" Public IN4 As String = "--" Public IN5 As String = "--" End Class Private Class EC_Marginal Public EC1 As String = "--" Public EC2 As String = "--" Public EC3 As String = "--" Public EC4 As String = "--" Public EC5 As String = "--" End Class Private Class DG_Marginal Public DG1 As String = "--" Public DG2 As String = "--" Public DG3 As String = "--" Public DG4 As String = "--" Public DG5 As String = "--" End Class Private Class EQ_Marginal Public EQ1 As String = "--" Public EQ2 As String = "--" Public EQ3 As String = "--" Public EQ4 As String = "--" Public EQ5 As String = "--" End Class Private Class ES_Marginal Public ES1 As String = "--" Public ES2 As String = "--" Public ES3 As String = "--" Public ES4 As String = "--" Public ES5 As String = "--" End Class Private Class TXT_Marginal Public TXT1 As String = "--" Public TXT2 As String = "--" Public TXT3 As String = "--" Public TXT4 As String = "--" Public TXT5 As String = "--" End Class Private Class GS_Marginal Public GS1 As String = "--" Public GS2 As String = "--" Public GS3 As String = "--" Public GS4 As String = "--" Public GS5 As String = "--" End Class Private Class HHI_Marginal Public HHI1 As String = "--" Public HHI2 As String = "--" Public HHI3 As String = "--" Public HHI4 As String = "--" Public HHI5 As String = "--" End Class Private NPMarginalList As New List(Of NP_Marginal) Private RAMarginalList As New List(Of RA_Marginal) Private TVMarginalList As New List(Of TV_Marginal) Private MTMarginalList As New List(Of MT_Marginal) Private MMMarginalList As New List(Of MM_Marginal) Private INMarginalList As New List(Of IN_Marginal) Private ECMarginalList As New List(Of EC_Marginal) Private DGMarginalList As New List(Of DG_Marginal) Private EQMarginalList As New List(Of EQ_Marginal) Private ESMarginalList As New List(Of ES_Marginal) Private TXTMarginalList As New List(Of TXT_Marginal) Private GSMarginalList As New List(Of GS_Marginal) Private HHIMarginalList As New List(Of HHI_Marginal)
Any help is greatly appreciated!!! It's making me crazy!
If someone could show me how to populate one row I could figure out the rest.
I've been moving so many things around in my program, I'm afraid I'm going to break it and forget how to
put it back...
TIA!!!
Joni
Hello Joni,
I have two different patterns, neither load the DataGridView from classes, instead one utilizes a backend database, loads rows into the DataGridView via a DataTable while the other through a class instance.
The first mentioned above uses a CancellationTokenSource together with a Delegate to load data. Shown in the image below the load button (the code can be placed say in form load) loads data asynchronously in the the app remains responsive and the cancel button permits pausing the load or completely cancelling the load (this could in you code logic also rather than a button).
The second one uses a splash screen (could also be done in form load or form shown), behind the covers I use an Iterator in tangent with Yield.
Full source is here and as mentioned above does not exactly match what you have shown but may very well prompt for adapting to your issue.
https://code.msdn.microsoft.com/Populate-DataGridView-via-a3ede35a?redir=0
这篇关于使用BackGroundWorker内部的值更新DataGridView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!