【问题标题】:How to clear and reuse a DataGridView in powershell?如何在 powershell 中清除和重用 DataGridView?
【发布时间】:2018-01-25 15:29:21
【问题描述】:

我在 Windows 窗体中使用 Datagridview 来显示一些数据。 按下按钮后,数据会在后台加载。 当我第一次按下按钮时,这工作正常。

但我需要能够在不关闭表单的情况下一次又一次地执行此操作。 无论我尝试什么,在第二次按下 ok 后,我的 datagridview 都会变成白色的地面,上面有大红色的 x。我想清空/重置所有内容。

这是我的代码的精简版:

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()

【问题讨论】:

    标签: powershell arraylist datagridview runspace


    【解决方案1】:

    我看到两个问题,第一个是您需要清除数据源,第二个是您在单击按钮并打开运行空间后过早地尝试调用该操作。在那里放一个简单的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
    }
    

    【讨论】:

    • 非常感谢!所以问题是,我试图在 $task1 中设置 .DataSource = $null?但是你能解释一下,为什么我可以在 $task1 中设置 .DataSource = $softwareList,但不能在 $task1 中设置它 = $null?还有,为什么要改成$handle = $task1.BeginInvoke()?
    • 对不起,我的意思是在发布之前删除句柄,这只是我用于我的 xaml/PS 应用程序的东西。它不能在 task1 中的原因是 task1 在单独的运行空间中运行。当您单击该按钮时,它需要清除之前使用的同一运行空间中的数据网格。通过清除任务之外的源,您将重新开始,允许单击下一步按钮来声明数据源。
    • 好的,再次感谢。为什么在这个时候睡觉?在所有数据都已传递到 datagridview 之后发生睡眠。还是只是为了限制再次按下按钮的时间?
    • 我在单击按钮时遇到了很多问题,并且应用程序冻结或崩溃,尤其是在调用快速函数时。 sleep 函数给出了消除空值错误所需的暂停。
    【解决方案2】:

    我认为其中一个问题可能是您试图从不同的线程更新表单控件。我不是专家,但根据我的经验,在某些方面可能会出错。

    要清除datagridview,您是否尝试将datagridview 的Datasource 属性设置为$null,然后再为其分配新值?这就是我通常完成我的工作的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      相关资源
      最近更新 更多