You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法为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) }
    

额外优化建议

  1. 避免重复调用GetRecurrencePattern()
    获取周期性模式对象后复用,减少COM对象调用开销:

    $meetings = $items | Where-Object {
        $_.isRecurring -eq $true -and $_.Subject -notlike "*Canceled*"
    } | Select-Object Subject, Start, @{
        Name='Mask'
        Expression={
            $recurPattern = $_.GetRecurrencePattern()
            $recurPattern.DayOfWeekMask
        }
    }
    
  2. 将掩码转换为可读的星期名称
    .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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:45:32