目前,我正在尝试检查班级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”。
我想将它们添加到列表中并在第二个列表框中显示它们。 谁能帮我吗?谢谢。
答案 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.';
}