无法为DataGridView列填充日历会议的DayOfWeekMask属性值
问题描述
我正在开发一个小型副项目,通过WinForms的DataGridView列出Outlook日历中的周期性会议。目前可正常填充主题和开始日期列,但无法将.DayOfWeekMask属性值填充到对应的DataGridView列中——尽管通过CLI能正常访问该属性。
相关代码
add-type -AssemblyName 'System.Windows.Forms' Add-Type -AssemblyName 'System.Drawing' Add-Type -AssemblyName 'PresentationFramework' $4 = "BASE64 code" $today = get-date $Script:selection = @() add-type -AssemblyName "Microsoft.Office.Interop.Outlook" $outlookFolders = "Microsoft.Office.Interop.Outlook.OlDefaultFolders" -as [type] $outlook = New-Object -ComObject outlook.application $namespace = $outlook.GetNamespace("MAPI") $folder = $namespace.GetDefaultFolder($outlookFolders::olFolderCalendar) $items = $folder.Items $meetings = $items|?{$_.isRecurring -eq $true -and $_.Subject -notlike "*Canceled*" <#-and $_.GetRecurrencePattern().DayOfWeekMask -eq 18#>}|Select Subject, Start, @{l='Mask';e={$_.GetRecurrencePattern().DayOfWeekMask}} $bitmap3 = New-Object System.Windows.Media.Imaging.BitmapImage $bitmap3.BeginInit() $bitmap3.StreamSource = [System.IO.MemoryStream][System.Convert]::FromBase64String($4) $bitmap3.EndInit() $bitmap3.Freeze() $image3 = [System.Drawing.Bitmap][System.Drawing.Image]::FromStream($bitmap3.StreamSource) $icon3 = [System.Drawing.Icon]::FromHandle($image3.GetHicon()) $main2 = New-Object System.Windows.Forms.Form $main2.Icon = $icon3 $main2.ClientSize = '600,600' $main2.MinimizeBox = $false $main2.MaximizeBox = $false $main2.Text = 'Options' $main2.AutoSize = $true $grid = New-Object System.Windows.Forms.DataGridView $grid.Location = '5,5' $grid.Height = 500 $grid.Width = 390 $grid.ColumnHeadersVisible = $true $grid.AutoSizeColumnsMode = 'AllCells' $grid.ColumnCount = 3 $grid.columns[0].Name = 'Name' $grid.Columns[1].Name = 'Time' $grid.Columns[2].Name = 'Day Mask' $grid.MultiSelect = $true $grid.SelectionMode = 'FullRowSelect' $meetings|%{$grid.Rows.Add($($_.Subject), $($_.Start)), $($_.Mask)} $button = [System.Windows.Forms.Button]::new() $button.Location = [System.Drawing.Point]::new(5,540) $button.Size = [System.Drawing.Size]::new(100,50) $button.Text = 'OK' $button.Add_Click({ $grid.SelectedRows|%{ $Script:selection += [pscustomobject]@{ Name = $grid.Rows[$_.Index].Cells[0].Value Time = $grid.Rows[$_.Index].Cells[1].Value } } }) $main2.Controls.AddRange(@($grid,$button)) $main2.ShowDialog()
解决方案
核心问题:行添加语法错误
你在向DataGridView添加行时,错误地用括号包裹了前两个参数,导致第三个参数$_.Mask没有被正确传入Add()方法:
- 错误代码:
$grid.Rows.Add($($_.Subject), $($_.Start)), $($_.Mask)
这个写法相当于把($_.Subject, $_.Start)作为第一个参数,$_.Mask作为第二个参数传入,但DataGridViewRowCollection.Add()需要的是三个独立参数。 - 修正代码:
$meetings | ForEach-Object { $grid.Rows.Add($_.Subject, $_.Start, $_.Mask) }
额外优化建议
避免重复调用GetRecurrencePattern()
获取周期性模式对象后复用,减少COM对象调用开销:$meetings = $items | Where-Object { $_.isRecurring -eq $true -and $_.Subject -notlike "*Canceled*" } | Select-Object Subject, Start, @{ Name='Mask' Expression={ $recurPattern = $_.GetRecurrencePattern() $recurPattern.DayOfWeekMask } }将掩码转换为可读的星期名称
.DayOfWeekMask返回的是位掩码枚举值(1=周日,2=周一,4=周二,8=周三,16=周四,32=周五,64=周六),可以转换为更友好的显示文本:$dayMapping = @{ 1 = "周日" 2 = "周一" 4 = "周二" 8 = "周三" 16 = "周四" 32 = "周五" 64 = "周六" } $meetings = $items | Where-Object { $_.isRecurring -eq $true -and $_.Subject -notlike "*Canceled*" } | Select-Object Subject, Start, @{ Name='Mask' Expression={ $recurPattern = $_.GetRecurrencePattern() $selectedDays = @() foreach ($mask in $dayMapping.Keys) { if ($recurPattern.DayOfWeekMask -band $mask) { $selectedDays += $dayMapping[$mask] } } $selectedDays -join ", " } }
内容的提问来源于stack exchange,提问作者Nawad-sama
相关产品推荐
相关产品推荐

