Powershell Forms - 从选定的 ListView 项目中检索值和列名
Powershell Forms - retrieve both values and column names from selected ListView item
我有一个使用 Powershell 表单的工作脚本,为了方便起见,我正在从列表视图中的当前选定项目中检索值,并将它们复制到剪贴板,如下所示:
$UIDlist.Add_SelectedIndexChanged({
# Legacy Winforms behaviour can cause an error unless a null check is made
If($UIDlist.SelectedItems -ne $null) {
[string]$ClipText = $this.SelectedItems.SubItems.Text | ForEach-Object{$_ + "`r`n"}
$ClipText | Set-Clipboard
})
显然这只会输出子项的文本值,例如
johnsmith01
johnsmith@company.com
\myserver\johnsmith01
GPO Main Office
是否有一种简单的方法也可以获取这些值的列名?例如
SamAccountName johnsmith01
EmailAddress johnsmith@company.com
HomeDrive \myserver\johnsmith01
DepoartmentGPO GPO Main Office
似乎有一个 Name
属性 的 ListView 子项目,但我在构建 ListView 时找不到填充它的方法:
BackColor : Color [Window]
Bounds : {X=0,Y=0,Width=0,Height=0}
Font : [Font: Name=Microsoft Sans Serif, Size=8.25, Units=3, GdiCharSet=0, GdiVerticalFont=False]
ForeColor : Color [WindowText]
Tag :
Text : johnsmith01
Name :
那么,在选择 ListView 项目时,是否有一种简单的方法来检索值和这些值的列名?
列表视图项的名称不是列名。如果您想区分呈现给用户的内容(文本)和您将在幕后工作的实际值,它就在那里。
要获取列名,您需要自己解决。
这是有用的东西。
在 Add_SelectedIndexChangedMethod
之前的某处声明,这样它就不会每次都被无意义地调用。
$ColumnsName = $ListView.Columns.Text
# Used for padded formatting
$LongestColLength = ($ColumnsName | % { $_.length } | Measure-Object -Maximum ).Maximum + 1
$ListView.Items[0].SubItems.text
以及实际的 $ClipText
部分
$ClipText = for ($i = 0; $i -lt $ColumnsName.Count ;$i++) {
"{0}: {1} `r`n" -f $ColumnsName[$i].PadRight($LongestColLength, ' '), $this.SelectedItems.SubItems[$i].Text
}
输出
根据你的代码,我假设你想立即将它以漂亮的格式发送到剪贴板,但如果情况并非如此,我会生成一个你想要的 PSObject,这样你就可以做额外的事情轻松操控。
$ClipText = for ($i = 0; $i -lt $ColumnsName.Count ;$i++) {
[PSCustomObject]@{
ColumnName = $ColumnsName[$i]
Text = $this.SelectedItems.SubItems[$i].Text
}
}
只要准备就绪,您仍然可以将新形成的 PSObject 转换为其最终格式。
用户友好(利用最长的列长度进行填充)
$ClipText | % { '{0}: {1}' -f $_.ColumnName.PadRight($LongestColLength,' '),$_.Text}
机器友好
$ClipText | ConvertTo-Json
如 Sage post 中的答案。在我的例子中,我需要添加以下内容以使剪贴板格式和输出正确:
[string]$ClipText = for ($i = 0; $i -lt $ColumnsName.Count ;$i++) {
'{0}: {1}' -f $ColumnsName[$i].PadRight($LongestColLength, ' '), $this.SelectedItems.SubItems[$i].Text + "`r`n"
}
没有 [string]
只有最后一个对象在剪贴板中并且还需要回车 return/newline
我安装了 PSCX 模块,它修改了 Set-Clipboard 命令,所以 YMMV
我有一个使用 Powershell 表单的工作脚本,为了方便起见,我正在从列表视图中的当前选定项目中检索值,并将它们复制到剪贴板,如下所示:
$UIDlist.Add_SelectedIndexChanged({
# Legacy Winforms behaviour can cause an error unless a null check is made
If($UIDlist.SelectedItems -ne $null) {
[string]$ClipText = $this.SelectedItems.SubItems.Text | ForEach-Object{$_ + "`r`n"}
$ClipText | Set-Clipboard
})
显然这只会输出子项的文本值,例如
johnsmith01
johnsmith@company.com
\myserver\johnsmith01
GPO Main Office
是否有一种简单的方法也可以获取这些值的列名?例如
SamAccountName johnsmith01
EmailAddress johnsmith@company.com
HomeDrive \myserver\johnsmith01
DepoartmentGPO GPO Main Office
似乎有一个 Name
属性 的 ListView 子项目,但我在构建 ListView 时找不到填充它的方法:
BackColor : Color [Window]
Bounds : {X=0,Y=0,Width=0,Height=0}
Font : [Font: Name=Microsoft Sans Serif, Size=8.25, Units=3, GdiCharSet=0, GdiVerticalFont=False]
ForeColor : Color [WindowText]
Tag :
Text : johnsmith01
Name :
那么,在选择 ListView 项目时,是否有一种简单的方法来检索值和这些值的列名?
列表视图项的名称不是列名。如果您想区分呈现给用户的内容(文本)和您将在幕后工作的实际值,它就在那里。
要获取列名,您需要自己解决。 这是有用的东西。
在 Add_SelectedIndexChangedMethod
之前的某处声明,这样它就不会每次都被无意义地调用。
$ColumnsName = $ListView.Columns.Text
# Used for padded formatting
$LongestColLength = ($ColumnsName | % { $_.length } | Measure-Object -Maximum ).Maximum + 1
$ListView.Items[0].SubItems.text
以及实际的 $ClipText
部分
$ClipText = for ($i = 0; $i -lt $ColumnsName.Count ;$i++) {
"{0}: {1} `r`n" -f $ColumnsName[$i].PadRight($LongestColLength, ' '), $this.SelectedItems.SubItems[$i].Text
}
输出
根据你的代码,我假设你想立即将它以漂亮的格式发送到剪贴板,但如果情况并非如此,我会生成一个你想要的 PSObject,这样你就可以做额外的事情轻松操控。
$ClipText = for ($i = 0; $i -lt $ColumnsName.Count ;$i++) {
[PSCustomObject]@{
ColumnName = $ColumnsName[$i]
Text = $this.SelectedItems.SubItems[$i].Text
}
}
只要准备就绪,您仍然可以将新形成的 PSObject 转换为其最终格式。
用户友好(利用最长的列长度进行填充)
$ClipText | % { '{0}: {1}' -f $_.ColumnName.PadRight($LongestColLength,' '),$_.Text}
机器友好
$ClipText | ConvertTo-Json
如 Sage post 中的答案。在我的例子中,我需要添加以下内容以使剪贴板格式和输出正确:
[string]$ClipText = for ($i = 0; $i -lt $ColumnsName.Count ;$i++) {
'{0}: {1}' -f $ColumnsName[$i].PadRight($LongestColLength, ' '), $this.SelectedItems.SubItems[$i].Text + "`r`n"
}
没有 [string]
只有最后一个对象在剪贴板中并且还需要回车 return/newline
我安装了 PSCX 模块,它修改了 Set-Clipboard 命令,所以 YMMV