使用 Powershell Windows 窗体将复选框添加到列表框 [英] Add checkboxes to Listbox with Powershell Windows Forms

查看:39
本文介绍了使用 Powershell Windows 窗体将复选框添加到列表框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在根据我之前的帖子创建一个新问题:
在 Powershell (Winforms) 中更改单个列表框项目的颜色

I am creating a new question based on my previous post :
Change the Color of Individual ListBox items in Powershell (Winforms)

我的以下代码运行良好(感谢 Micky Balladelli),但我的老板让我添加复选框.如何修改此代码以添加一些复选框?

I have got the following code working very well (thanks to Micky Balladelli) but my boss asked me to add checkboxes. How can I adapt this code to add some checkboxes?

我在 MSDN 上的 ListBox 属性中进行了搜索,但没有看到任何添加复选框的属性.也许使用 CheckedListBox 类会更好,但在这种情况下,显示我的颜色看起来很复杂.

I searched on MSDN in the ListBox Properties and I didn't saw any properties to add checkboxes. Maybe it would be better to use the CheckedListBox class but in that case it looks complicated to display my colours.

我尝试过 Listview 类,但这不是我所期望的.

I tried with Listview class but it's not what I am expecting for.

任何帮助将不胜感激!

function add {
 $status='logged1','disconnected1','locked1','logged2','disconnected2','locked2','logged3','disconnected3','locked3'
 foreach ($s in $status)
 {
    $listbox.Items.Add($s)
 }
}

$listBox_DrawItem={
 param(
  [System.Object] $sender, 
  [System.Windows.Forms.DrawItemEventArgs] $e
 )
   #Suppose Sender de type Listbox
 if ($Sender.Items.Count -eq 0) {return}

   #Suppose item de type String
 $lbItem=$Sender.Items[$e.Index]
 if ( $lbItem.contains('locked'))  
 { 
    $Color=[System.Drawing.Color]::yellowgreen       
    try
    {
      $brush = new-object System.Drawing.SolidBrush($Color)
      $e.Graphics.FillRectangle($brush, $e.Bounds)
    }
    finally
    {
      $brush.Dispose()
    }
   }
 $e.Graphics.DrawString($lbItem, $e.Font, [System.Drawing.SystemBrushes]::ControlText, (new-object System.Drawing.PointF($e.Bounds.X, $e.Bounds.Y)))
}     

#Generated Form Function
function GenerateForm {


#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
#endregion

#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$add = New-Object System.Windows.Forms.Button
$listbox = New-Object System.Windows.Forms.ListBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
#Provide Custom Code for events specified in PrimalForms.
$handler_form1_Load= 
{
#TODO: Place custom script here

}

$handler_btnRechercher_Click= 
{
add
#TODO: Place custom script here

}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
    $form1.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$form1.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240)
$form1.Text = "Move VM"
$form1.Name = "form1"
$form1.AutoScaleMode = 3

$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.AutoScroll = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 357
$System_Drawing_Size.Height = 486
$form1.ClientSize = $System_Drawing_Size
$form1.add_Load($handler_form1_Load)

$listbox.FormattingEnabled = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 330
$System_Drawing_Size.Height = 407
$listbox.Size = $System_Drawing_Size
$listbox.DataBindings.DefaultDataSourceUpdateMode = 0
$listbox.Name = "listbox"

$listBox.DrawMode = [System.Windows.Forms.DrawMode]::OwnerDrawFixed
$listBox.Add_DrawItem($listBox_DrawItem)

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 21
$listbox.Location = $System_Drawing_Point
$listbox.TabIndex = 4
$listbox.add_Click($action_si_click_sur_VMKO)

$form1.Controls.Add($listbox)

#endregion Generated Form Code

#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form

add

$form1.ShowDialog()| Out-Null

} #End Function

#Call the Function
GenerateForm

推荐答案

诀窍是使用 ListView 而不是 CheckedListBox.

The trick is to use ListView instead of CheckedListBox.

以下包含有相当多变化的完整代码.

The following contains the full code with quite a bit of changes.

function add {
 $status='logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','logged1','disconnected1','locked1','logged2','disconnected2','locked2','logged3','disconnected3','locked3'
 foreach ($s in $status)
 {
    $i =$listbox.Items.Add($s)
 }
}

$listBox_DrawItem={
param(
  [System.Object] $sender, 
  [System.Windows.Forms.DrawListViewItemEventArgs] $e
 )

 if ( $e.Item.text.contains('locked'))  
 { 
    $Color=[System.Drawing.Color]::yellowgreen       
    try
    {
      $brush = new-object System.Drawing.SolidBrush($Color)
      $e.Graphics.FillRectangle($brush, $e.Bounds)
    }
    finally
    {
      $brush.Dispose()
    }
 }
 else
 {
    $e.DrawBackground();
 }

 $e.DrawFocusRectangle();
 if ($e.Item.Checked)
 {
    [System.Windows.Forms.ControlPaint]::DrawCheckBox($e.Graphics,$e.Bounds.X, $e.Bounds.Top + 1, 15, 15, [System.Windows.Forms.ButtonState]::Checked)
 }
 else
 {
    [System.Windows.Forms.ControlPaint]::DrawCheckBox($e.Graphics,$e.Bounds.X, $e.Bounds.Top + 1, 15, 15, [System.Windows.Forms.ButtonState]::Flat)
 }

   [System.Drawing.font] $headerFont = new-object System.Drawing.font("Helvetica", 
            10, [System.Drawing.FontStyle]::Regular)

   $sf = new-object System.Drawing.StringFormat
   $sf.Alignment = [System.Drawing.StringAlignment]::Near

     $rect = New-Object System.Drawing.RectangleF
     $rect.x = $e.Bounds.X+16
     $rect.y = $e.Bounds.Top+1
     $rect.width = $e.bounds.right
     $rect.height = $e.bounds.bottom
   $e.Graphics.DrawString($e.item.Text, 
                          $headerFont, 
                          [System.Drawing.Brushes]::Black, 
                          $rect, 
                          $sf)
}     
$listBox_DrawSubItem={
param(
  [System.Object] $sender, 
  [System.Windows.Forms.DrawListViewSubItemEventArgs] $e
 )
}     

$listBox_DrawHeader={
param(
  [System.Object] $sender, 
  [System.Windows.Forms.DrawListViewColumnHeaderEventArgs] $e
 )

   [System.Drawing.font] $headerFont = new-object System.Drawing.font("Helvetica", 
            10, [System.Drawing.FontStyle]::Bold)
   $e.DrawBackground();
   $sf = new-object System.Drawing.StringFormat
   $sf.Alignment = [System.Drawing.StringAlignment]::Center

     $rect = New-Object System.Drawing.RectangleF
     $rect.x = $e.Bounds.X+16
     $rect.y = $e.Bounds.Top+1
     $rect.width = $e.bounds.right
     $rect.height = $e.bounds.bottom
     $e.Graphics.DrawString($e.Column.text,$e.Item.Font,[System.Drawing.Brushes]::Black, $rect )
   $e.Graphics.DrawString($e.Header.Text, 
                          $headerFont, 
                          [System.Drawing.Brushes]::Black, 
                          $rect, 
                          $sf)
}     



#Generated Form Function
function GenerateForm {


#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
#endregion

#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$add = New-Object System.Windows.Forms.Button
$listbox = New-Object System.Windows.Forms.Listview
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
#Provide Custom Code for events specified in PrimalForms.
$handler_form1_Load= 
{
#TODO: Place custom script here

}

$handler_btnRechercher_Click= 
{
add
#TODO: Place custom script here

}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
    $form1.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$form1.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240)
$form1.Text = "Move VM"
$form1.Name = "form1"
$form1.AutoScaleMode = 3

$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.AutoScroll = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 357
$System_Drawing_Size.Height = 486
$form1.ClientSize = $System_Drawing_Size
$form1.add_Load($handler_form1_Load)

$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 330
$System_Drawing_Size.Height = 407
$listbox.Size = $System_Drawing_Size
$listbox.DataBindings.DefaultDataSourceUpdateMode = 0
$listbox.Name = "listview"
$listBox.view = [System.Windows.Forms.View]::Details
$listbox.CheckBoxes = $true
$listbox.fullrowselect = $true
$listBox.OwnerDraw = $true
$listBox.Add_DrawItem($listBox_DrawItem)
$listBox.Add_DrawSubItem($listBox_DrawSubItem)
$listBox.add_DrawColumnHeader($listBox_DrawHeader)
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 21
$listbox.Location = $System_Drawing_Point
$listbox.TabIndex = 4
$listbox.add_Click($action_si_click_sur_VMKO)
$listBox.Columns.Add("VMs", 300, [System.Windows.Forms.HorizontalAlignment]::Center) | out-null

$form1.Controls.Add($listbox)

#endregion Generated Form Code

#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form

add

$form1.ShowDialog()| Out-Null

} #End Function

#Call the Function
GenerateForm    

这篇关于使用 Powershell Windows 窗体将复选框添加到列表框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆