为什么在 wpf 列表框中选择的值为空?
Why is selected value null in wpf listbox?
我已使用 entity framework 连接到数据库,并将汽车的品牌和型号以以下格式放入列表框中:品牌 - 型号。
当我 select 列表框中的一个项目时,我想获取该对象的 ID 以在另一个查询中使用它,该查询将在文本块中显示该特定汽车(数据库中的行)的完整详细信息.
当我 select 列表框中的项目时,它会在以下位置返回空值:
int id = (int)ltbxAvailableCars.SelectedValue;
在XAML中,我指定了:
Listbox SelectedValuePath="ID"
这里有没有我没有看到的明显错误?
提前致谢。
public partial class MainWindow : Window
{
CarRentalDBEntities db = new CarRentalDBEntities();
public enum CarType { All, Small, Medium, Large }
public MainWindow()
{
InitializeComponent();
cbxCarType.ItemsSource = Enum.GetValues(typeof(CarType));
}
private void btnSearch_Click(object sender, RoutedEventArgs e)
{
CarType type;
Enum.TryParse<CarType>(cbxCarType.SelectedValue.ToString(), out type);
string carType = type.ToString();
if (carType == "All")
{
ltbxAvailableCars.Items.Clear();
var cars = from c in db.Cars
select new
{
c.ID,
c.Make,
c.Model,
c.Size
};
foreach (var car in cars)
{
ltbxAvailableCars.Items.Add(car.Make + " - " + car.Model);
}
}
else
{
ltbxAvailableCars.Items.Clear();
var cars = from c in db.Cars
where c.Size == carType
select new
{
c.ID,
c.Make,
c.Model,
c.Size
};
foreach (var car in cars)
{
ltbxAvailableCars.Items.Add(car.Make + " - " + car.Model);
}
}
}
private void ltbxAvailableCars_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
int id = (int)ltbxAvailableCars.SelectedValue;
CarRentalDBEntities db = new CarRentalDBEntities();
var query = from c in db.Cars
where c.ID == id
select new
{
c.ID,
c.Make,
c.Model,
c.Size
};
tblkSelectedCarDetails.Text = query.ToString();
}
}
根据您的情况,您可以尝试使用 e.AddedItems
(传递给您的方法的参数 ltbxAvailableCars_SelectionChanged
)并从中提取值,详见 MSDN 在线:https://msdn.microsoft.com/en-us/library/system.windows.controls.selectionchangedeventargs%28v=vs.110%29.aspx
希望这可能有所帮助。最好的问候,
这是针对您的案例的方法。但在我看来,你提到的 ObservableCollection
数据绑定似乎更优雅,甚至更容易
创建 class 以在列表框项目
中保留所需的值
public class Car
{
public Int32 ID { get; set; }
public DateTime Make { get; set; }
public String Model { get; set; }
public override string ToString()
{
return String.Format("{0} - {1}", this.Make, this.Model);
}
}
ToString
将被覆盖并且 return 您想要显示在列表框中的字符串。
ListBox 调用 .ToString()
显示文本项的方法
然后在 LINQ 查询中创建 class 的实例并将它们添加到列表框
ltbxAvailableCars.Items.Clear();
var cars = from c in db.Cars
where c.Size == carType
select new Car
{
ID = c.ID,
Make = c.Make,
Model = c.Model
};
foreach (Car car in cars)
{
ltbxAvailableCars.Items.Add(car);
}
并在 SelectionChanged
事件处理程序中使用它
private void ltbxAvailableCars_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Car temp = (Car)ltbxAvailableCars.SelectedItem;
Int32 id = temp.ID
CarRentalDBEntities db = new CarRentalDBEntities();
var query = from c in db.Cars
where c.ID == id
select new
{
c.ID,
c.Make,
c.Model,
c.Size
};
tblkSelectedCarDetails.Text = query.ToString();
}
我已使用 entity framework 连接到数据库,并将汽车的品牌和型号以以下格式放入列表框中:品牌 - 型号。
当我 select 列表框中的一个项目时,我想获取该对象的 ID 以在另一个查询中使用它,该查询将在文本块中显示该特定汽车(数据库中的行)的完整详细信息.
当我 select 列表框中的项目时,它会在以下位置返回空值:
int id = (int)ltbxAvailableCars.SelectedValue;
在XAML中,我指定了:
Listbox SelectedValuePath="ID"
这里有没有我没有看到的明显错误?
提前致谢。
public partial class MainWindow : Window
{
CarRentalDBEntities db = new CarRentalDBEntities();
public enum CarType { All, Small, Medium, Large }
public MainWindow()
{
InitializeComponent();
cbxCarType.ItemsSource = Enum.GetValues(typeof(CarType));
}
private void btnSearch_Click(object sender, RoutedEventArgs e)
{
CarType type;
Enum.TryParse<CarType>(cbxCarType.SelectedValue.ToString(), out type);
string carType = type.ToString();
if (carType == "All")
{
ltbxAvailableCars.Items.Clear();
var cars = from c in db.Cars
select new
{
c.ID,
c.Make,
c.Model,
c.Size
};
foreach (var car in cars)
{
ltbxAvailableCars.Items.Add(car.Make + " - " + car.Model);
}
}
else
{
ltbxAvailableCars.Items.Clear();
var cars = from c in db.Cars
where c.Size == carType
select new
{
c.ID,
c.Make,
c.Model,
c.Size
};
foreach (var car in cars)
{
ltbxAvailableCars.Items.Add(car.Make + " - " + car.Model);
}
}
}
private void ltbxAvailableCars_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
int id = (int)ltbxAvailableCars.SelectedValue;
CarRentalDBEntities db = new CarRentalDBEntities();
var query = from c in db.Cars
where c.ID == id
select new
{
c.ID,
c.Make,
c.Model,
c.Size
};
tblkSelectedCarDetails.Text = query.ToString();
}
}
根据您的情况,您可以尝试使用 e.AddedItems
(传递给您的方法的参数 ltbxAvailableCars_SelectionChanged
)并从中提取值,详见 MSDN 在线:https://msdn.microsoft.com/en-us/library/system.windows.controls.selectionchangedeventargs%28v=vs.110%29.aspx
希望这可能有所帮助。最好的问候,
这是针对您的案例的方法。但在我看来,你提到的 ObservableCollection
数据绑定似乎更优雅,甚至更容易
创建 class 以在列表框项目
public class Car
{
public Int32 ID { get; set; }
public DateTime Make { get; set; }
public String Model { get; set; }
public override string ToString()
{
return String.Format("{0} - {1}", this.Make, this.Model);
}
}
ToString
将被覆盖并且 return 您想要显示在列表框中的字符串。
ListBox 调用 .ToString()
显示文本项的方法
然后在 LINQ 查询中创建 class 的实例并将它们添加到列表框
ltbxAvailableCars.Items.Clear();
var cars = from c in db.Cars
where c.Size == carType
select new Car
{
ID = c.ID,
Make = c.Make,
Model = c.Model
};
foreach (Car car in cars)
{
ltbxAvailableCars.Items.Add(car);
}
并在 SelectionChanged
事件处理程序中使用它
private void ltbxAvailableCars_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Car temp = (Car)ltbxAvailableCars.SelectedItem;
Int32 id = temp.ID
CarRentalDBEntities db = new CarRentalDBEntities();
var query = from c in db.Cars
where c.ID == id
select new
{
c.ID,
c.Make,
c.Model,
c.Size
};
tblkSelectedCarDetails.Text = query.ToString();
}