铸造错误

时间:2018-02-07 08:58:31

标签: c# wpf casting listbox entity

目前,我正在尝试检查班级LandCode中的Landen以获取selectedItem地区的城市,但我正在解析错误。

public partial class Landen
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Landen()
    {
        this.Steden = new HashSet<Steden>();
        this.Talen = new HashSet<Talen>();
    }

    public string LandCode { get; set; }
    public string Naam { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Steden> Steden { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Talen> Talen { get; set; }
}



public MainWindow()
{
    InitializeComponent();
    var context = new LandenStedenTalenEntities();
    landenListBox.ItemsSource = (from Landen in context.Landen select Landen.Naam).ToList();
}

private void landenListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    using (var entities = new LandenStedenTalenEntities())
    {
        List<string> steden = new List<string>();
        var landcode = ((Landen)landenListBox.SelectedItem).LandCode.ToString();
        var gekozenland = entities.Landen.Find(landcode);

        foreach(var stad in gekozenland.Steden)
        {
            steden.Add(stad.Naam);
        }
        stedenInLandenListBox.ItemsSource = steden.ToList();
    }
}

例外:

  

无法将“System.String”类型的对象强制转换为“TestEFDieter.Landen”。

我想将它们添加到列表中并在第二个列表框中显示它们。 谁能帮我吗?谢谢。

enter image description here

2 个答案:

答案 0 :(得分:1)

我想你想得到Landen的实例,它与你列表中的选定项目相对应。由于列表框中的元素只是表示每个Naam的{​​{1}} - 属性的字符串,因此您可以简单地迭代Landen的列表并使用所需的{{1}获取该列表}:

Landen

但是,Naam已经 var selectedLanden = landenList.FirstOrDefault(x => x.Naam == landenListBox.SelectedItem); if(selectedLanden != null) { var landCode = selectedLanden.LandCode; // ... } 的实例,您无需再通过其selectedLanden找到它。因此,你的代码可以归结为:

Landen

或者更短一些:

LandCode

为了实现这一点,您当然必须存储对您班级中某些人List<string> steden = new List<string>(); var selectedLanden = landenList.FirstOrDefault(x => x.Naam == landenListBox.SelectedItem); if(selectedLanden != null) { foreach(var stad in selectedLanden.Steden) { steden.Add(stad.Naam); } } stedenInLandenListBox.ItemsSource = steden.ToList(); 列表的引用:

stedenInLandenListBox.ItemsSource = selectedLanden.SelectMany(x => x.Steden.Select(y => y.Naam)).ToList();

答案 1 :(得分:1)

我建议您修改构造函数中的代码,以便landenListBox包含实际的Landen对象,并仅显示Naam作为其项目。

将构造函数中的代码更改为:

public MainWindow()
{
    InitializeComponent();
    var context = new LandenStedenTalenEntities();
    landenListBox.ItemsSource = context.Landen.ToList();
    landenListBox.DisplayMemberPath = "Naam";
}

添加DisplayMemberPath会通知ListBox将该特定属性显示为项目,而不是在该对象上调用ToString()方法。

现在,在以后的代码中,您不需要进行太多更改,只需删除ToList(),因为您使用EntityFramework,所以您应该将整个模型插入其中Find() stad 1}}方法,但由于你已经加载了该对象,因此它没用。您可以直接从中检索Landen并以与显示private void landenListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { var landen = landenListBox.SelectedItem as Landen; // safe cast just in case if (landen != null && landen.Steden != null ) // null checks { stedenInLandenListBox.ItemsSource = landen.Steden.ToList(); // in case it's proxy object stadenInLandenListBox.DisplayMemberPath = "Naam"; } } 相同的方式显示它:

$url = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];


if (strpos($url,'<find_text_name>') !== false) {
    echo 'find_text_name exists.';
} else {
    echo 'No find_text_name.';
}