为什么我会收到System.InvalidOperationException?

时间:2018-05-29 10:26:58

标签: c# .net wpf linq

此刻我真的很绝望。我正在编写一个WPF程序。我根据数据库中存储的元素数量,动态地在网格标签内构建了一个简单的XAML-construct和生成的网格。即使我定义了Label并将其命名为label,我也得到System.InvalidOperationException。我找到了这个解决方案here。我的实际问题是,我需要在此网格中获取标签的内容。我把这个问题与我所链接的问题完全相似。

我希望你理解我的意思。

这是我的代码:

for (int i = 0; i < numberOfBooks; i++)
{
    Grid grid = new Grid();
    RowDefinition row = new RowDefinition();

    ColumnDefinition column = new ColumnDefinition();
    ColumnDefinition column2 = new ColumnDefinition();
    ColumnDefinition column3 = new ColumnDefinition();

    Label label = new Label();
    label.Content = Books[i].Titel;

    upperGrid.RowDefinitions.Add(row);
    grid.ColumnDefinitions.Add(column);
    grid.ColumnDefinitions.Add(column2);
    grid.ColumnDefinitions.Add(column3);

    Grid.SetRow(label, i);
    Grid.SetColumn(label, 0);
    Grid.SetRow(grid, i);
    upperGrid.Children.Add(grid);
    grid.Children.Add(label);

    grid.MouseLeftButtonDown += (sen, evg) =>
    {
        Label lbl = grid.Children.OfType<Label>().First(k => k.Name=="label"); //Here I get the exception
        string result = lbl.Name.ToString();
        Console.WriteLine(result);
    }; 
}

1 个答案:

答案 0 :(得分:2)

首先会抛出。使用FirstOrDefault将返回default<T>null-conditional operator?.):

Label lbl = grid.Children.OfType<Label>().FirstOrDefault(k => k.Name=="label");
string result = lbl?.Name.ToString();
Console.WriteLine(result);

但是,由于这是一个WPF项目,我建议使用MessageBox或类似的东西来显示结果,而不是Console.WriteLine,如下所示:

首先将其添加到using指令中:

using System.Windows; 

然后:

MessageBox.Show(result);