【问题标题】:C#/WPF: Looping through DataGrid CheckBoxColumn - failing to trigger code at the right timeC#/WPF:循环通过 DataGrid CheckBoxColumn - 未能在正确的时间触发代码
【发布时间】:2022-01-14 13:01:24
【问题描述】:

使用下面的方法,我试图为循环遍历的 DataGrid CheckBoxColumn 中的每一行触发代码。有用!什么不起作用,如果所有框都未选中,我还想触发另一组代码。 现在,无论未选中多少个框,它都会触发代码,除非我选中第一个。我尝试使用布尔标志跳出循环

如何重写我的方法以达到预期的结果? 我的CheckBoxColumn 不是三态的,我还没有研究过,我宁愿不要,除非绝对必要。

public void VerifyInvoices() {

    foreach (PaidTrip item in PaidTrips) {

        if (item.IsChecked == true) {

            ShowPreviewInvoiceDetailed();
            First = false;

        } else if (item.IsChecked == false && First == true) {

            MessageBox.Show("You must choose an invoice to preview first.");
            return;
        }
    }
}

我的CheckBoxColumn

<DataGridCheckBoxColumn
    Width="146" HeaderStyle="{StaticResource CenterGridHeaderStyle}"
    Binding="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}">

    <DataGridCheckBoxColumn.ElementStyle>
        <Style TargetType="{x:Type CheckBox}">
            <Setter Property="HorizontalAlignment" Value="Center"/>
            <Setter Property="ClickMode" Value="Press"/>
        </Style>
    </DataGridCheckBoxColumn.ElementStyle>
</DataGridCheckBoxColumn>

【问题讨论】:

    标签: c# wpf loops xaml foreach


    【解决方案1】:

    仅在所有 PaidTrips 均经过验证且未找到任何检查时才显示 MessageBox:

    public void VerifyInvoices()
    {
        bool success = false;
        foreach (PaidTrip item in PaidTrips) 
        {
            if (item.IsChecked == true) 
            {
                ShowPreviewInvoiceDetailed();
                success = true;
            }
        }
        if (!success) 
        {
            MessageBox.Show("You must choose an invoice to preview first.");
        }
    }
    

    【讨论】:

    • 同意,我都没注意
    • 啊!有时候,我真的很有天赋,可以多想一些事情。这在现在看来是如此明显。谢谢!
    【解决方案2】:

    您可以使用 LINQ 检查所有项目是否满足条件:

    ...
    if (item.IsChecked == true) {
    
        ShowPreviewInvoiceDetailed();
        First = false;
    
    } else 
      {
        if(PaidTrips.All(t => t.IsChecked == false))
        {
            MessageBox.Show("You must choose an invoice to preview first.");
            return;
        }           
    }
    

    【讨论】:

    • 甜美,像魅力一样工作。我也可以摆脱 bool 标志。非常感谢!
    • 喜欢魅力?更有可能是一个黑暗的诅咒:这里的复杂度是 O(n^2),而不是 O(n)。
    • @OleM 我同​​意 Ash
    • @Crowcoder,最重要的是,PaidTrips 的多个枚举可能会产生不同的数据
    • @ASh haha​​.. 让我咯咯笑。由于似乎达成共识,您的答案是更好的答案,我将其标记为已接受。谢谢!支持 Crowcoder 谦虚! :-)
    猜你喜欢
    • 1970-01-01
    • 2015-07-13
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2021-07-02
    • 2022-07-01
    • 2019-08-16
    相关资源
    最近更新 更多