如何在 powershell 中清除和重用 DataGridView?
How to clear and reuse a DataGridView in powershell?
我在 windows 表单中使用 Datagridview 来显示一些数据。
按下按钮后,数据将在后台加载。
当我第一次按下按钮时,这工作正常。
但我需要能够在不关闭表单的情况下一次又一次地执行此操作。
无论我尝试什么,在第二次按下 ok 之后,我的 datagridview 都会变成白色的地面,上面有红色的大 x。我想empty/reset一切。
这是我的代码的简化版本:
Add-Type -AssemblyName System.Windows.Forms
$sync = [Hashtable]::Synchronized(@{})
$backgroundTask = {
$task1 = [PowerShell]::Create().AddScript({
#here I would like to clear all data from a previous execution. But nothing worked.
$softwareQuery = Get-WMIObject -ComputerName localhost -Class Win32_Product | Select Name
$softwareList = New-Object System.collections.ArrayList
$softwareList.AddRange($softwareQuery)
$sync.softwareTable.DataSource = $softwareList
})
$runspace = [RunspaceFactory]::CreateRunspace()
$runspace.ApartmentState = "STA"
$runspace.ThreadOptions = "ReuseThread"
$runspace.Open()
$runspace.SessionStateProxy.SetVariable("sync", $sync)
$task1.Runspace = $runspace
$task1.BeginInvoke()
}
$mainForm = New-Object system.Windows.Forms.Form
$mainForm.Size = New-Object System.Drawing.Size(900,600)
$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(280,5)
$okButton.Size = New-Object System.Drawing.Size(75,20)
$okButton.Text = "OK"
$okButton.Add_Click($backgroundTask) ;
$mainForm.Controls.Add($okButton)
$softwareTable = New-Object System.Windows.Forms.DataGridView -Property @{
Location=New-Object System.Drawing.Point(5,30)
Size=New-Object System.Drawing.Size(840,360)
ColumnHeadersVisible = $true
}
$mainForm.Controls.Add($softwareTable)
$sync.softwareTable = $softwareTable
$mainForm.ShowDialog()
我认为问题之一可能是您正试图从不同的线程更新表单控件。我不是专家,但根据我的经验,在某些方面可能会出错。
要清除datagridview,您是否尝试过将datagridview 的Datasource
属性 设置为$null
,然后再为其分配新值?这就是我通常完成我的工作的方式。
我看到两个问题,第一个是您需要清除数据源,第二个是您在单击按钮并打开运行空间后试图过早地调用操作。将一个简单的 start-sleep
放在那里,该问题应该得到解决。我建议您利用休眠时间来获得最快的执行速度。第二个也是一个简单的修复方法,只需在声明 task1 之前清除数据源即可。这对我有用。
$backgroundTask = {
$sync.softwareTable.DataSource = $null
$task1 = [PowerShell]::Create().AddScript({
#here I would like to clear all data from a previous execution. But nothing worked.
$softwareQuery = Get-WMIObject -ComputerName virinfpshd001w -Class Win32_Product | Select Name
$softwareList = New-Object System.collections.ArrayList
$softwareList.AddRange($softwareQuery)
$sync.softwareTable.DataSource = $softwareList
})
$runspace = [RunspaceFactory]::CreateRunspace()
$runspace.ApartmentState = "STA"
$runspace.ThreadOptions = "ReuseThread"
$runspace.Open()
$runspace.SessionStateProxy.SetVariable("sync", $sync)
$task1.Runspace = $runspace
$handle = $task1.BeginInvoke()
Start-Sleep -seconds 5
}
我在 windows 表单中使用 Datagridview 来显示一些数据。 按下按钮后,数据将在后台加载。 当我第一次按下按钮时,这工作正常。
但我需要能够在不关闭表单的情况下一次又一次地执行此操作。 无论我尝试什么,在第二次按下 ok 之后,我的 datagridview 都会变成白色的地面,上面有红色的大 x。我想empty/reset一切。
这是我的代码的简化版本:
Add-Type -AssemblyName System.Windows.Forms
$sync = [Hashtable]::Synchronized(@{})
$backgroundTask = {
$task1 = [PowerShell]::Create().AddScript({
#here I would like to clear all data from a previous execution. But nothing worked.
$softwareQuery = Get-WMIObject -ComputerName localhost -Class Win32_Product | Select Name
$softwareList = New-Object System.collections.ArrayList
$softwareList.AddRange($softwareQuery)
$sync.softwareTable.DataSource = $softwareList
})
$runspace = [RunspaceFactory]::CreateRunspace()
$runspace.ApartmentState = "STA"
$runspace.ThreadOptions = "ReuseThread"
$runspace.Open()
$runspace.SessionStateProxy.SetVariable("sync", $sync)
$task1.Runspace = $runspace
$task1.BeginInvoke()
}
$mainForm = New-Object system.Windows.Forms.Form
$mainForm.Size = New-Object System.Drawing.Size(900,600)
$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(280,5)
$okButton.Size = New-Object System.Drawing.Size(75,20)
$okButton.Text = "OK"
$okButton.Add_Click($backgroundTask) ;
$mainForm.Controls.Add($okButton)
$softwareTable = New-Object System.Windows.Forms.DataGridView -Property @{
Location=New-Object System.Drawing.Point(5,30)
Size=New-Object System.Drawing.Size(840,360)
ColumnHeadersVisible = $true
}
$mainForm.Controls.Add($softwareTable)
$sync.softwareTable = $softwareTable
$mainForm.ShowDialog()
我认为问题之一可能是您正试图从不同的线程更新表单控件。我不是专家,但根据我的经验,在某些方面可能会出错。
要清除datagridview,您是否尝试过将datagridview 的Datasource
属性 设置为$null
,然后再为其分配新值?这就是我通常完成我的工作的方式。
我看到两个问题,第一个是您需要清除数据源,第二个是您在单击按钮并打开运行空间后试图过早地调用操作。将一个简单的 start-sleep
放在那里,该问题应该得到解决。我建议您利用休眠时间来获得最快的执行速度。第二个也是一个简单的修复方法,只需在声明 task1 之前清除数据源即可。这对我有用。
$backgroundTask = {
$sync.softwareTable.DataSource = $null
$task1 = [PowerShell]::Create().AddScript({
#here I would like to clear all data from a previous execution. But nothing worked.
$softwareQuery = Get-WMIObject -ComputerName virinfpshd001w -Class Win32_Product | Select Name
$softwareList = New-Object System.collections.ArrayList
$softwareList.AddRange($softwareQuery)
$sync.softwareTable.DataSource = $softwareList
})
$runspace = [RunspaceFactory]::CreateRunspace()
$runspace.ApartmentState = "STA"
$runspace.ThreadOptions = "ReuseThread"
$runspace.Open()
$runspace.SessionStateProxy.SetVariable("sync", $sync)
$task1.Runspace = $runspace
$handle = $task1.BeginInvoke()
Start-Sleep -seconds 5
}