我有一个绑定了一些数据的网格,来自数据库的下方和一个编辑按钮
<DataGrid AutoGenerateColumns="False" Name="SParts_grid" HorizontalAlignment="Center" Margin="32,101,32,0" VerticalAlignment="Top" Height="187" Width="530" >
<DataGrid.Columns>
<DataGridTextColumn Header="Part No" Binding="{Binding Path=SPartID}" />
<DataGridTextColumn Header="Part Code" Width="85" Binding="{Binding Path=SPartCode}" />
<DataGridTextColumn Header="Part Name" Width="160" Binding="{Binding Path=SPartName}" />
<DataGridTextColumn Header="Model" Width="120" Binding="{Binding Path=ModelName}" />
<DataGridTextColumn Header="Location" Binding="{Binding Path=SPartLocation}" />
<DataGridCheckBoxColumn Header="Active" Width="58" Binding="{Binding Path=SPartActive}" />
</DataGrid.Columns>
</DataGrid>
<Button x:Name="btnEdit" Content="Edit" HorizontalAlignment="Left" Margin="105,323,0,0" VerticalAlignment="Top" Width="75" Click="btnEdit_Click"/>
从名为TblSpareParts
的db表中提取的所有数据只有一列"ModelName"
来自另一个名为TblBikeModels
的表
所以我的代码在下面获取数据
window loaded function
private void Window_Loaded(object sender, RoutedEventArgs e)
{
LoadParts();
}
private void LoadParts()
{
RST_DBDataContext conn = new RST_DBDataContext();
var AllPArts = (from s in conn.TblSpareParts
join m in conn.TblBikeModels on s.ModelID equals m.ModelID
select new { s.SPartName, s.SPartCode, s.SPartLocation, s.SPartID, m.ModelName }).ToArray();
SParts_grid.ItemsSource = AllPArts;
}
它运作良好,但现在如果我需要选择它,它不能如下工作
private void btnEdit_Click(object sender, RoutedEventArgs e)
{
TblSparePart SelectedSPData = SParts_grid.SelectedItem as TblSparePart;
if (SelectedSPData == null)
{
MessageBox.Show("You Must Select a Part");
}
else
{
MessageBox.Show("Selected");
}
}
但是当我使用这个LoadParts
函数时,selecteditem
工作正常,但它没有显示ModelName
列中的数据
private void LoadParts()
{
RST_DBDataContext conn = new RST_DBDataContext();
List<TblSparePart> AllPArts = (from s in conn.TblSpareParts
select s).ToList();
SParts_grid.ItemsSource = AllPArts;
}
基本上问题出在LoadParts
函数
答案 0 :(得分:0)
执行select new { s.SPartName, s.SPartCode, s.SPartLocation, s.SPartID, m.ModelName }
时,将返回匿名类型,而不是TblSparePart
对象。
这就是投射SParts_grid.SelectedItem as TblSparePart;
返回null
。
答案 1 :(得分:0)
我认为你有一个UI设计问题。使用DataGrid
中的联接表肯定会获得重复数据,这是您可能必须避免的。更好的解决方案是使用两个DataGrid
或(ComboBox
和DataGrid
)一个用于模型表,另一个用于与模型相关的项目。
如果您正在使用Entity框架,那么任务就容易多了。您只需将绑定指向相关的模型表即可。
看看这个案子:
public class Item
{
public int Id {get;set;}
public string Name {get;set;}
public Model Model {get;set;}
}
public class Model
{
public int Id {get;set;}
public string Name {get;set;}
}
在这里你可以像你第二次那样做。通过仅加载DataGrid
中的Items表,您可以添加指向Model Name属性的列。由于EF提供的延迟加载,它将准备好显示。
<DataGridTextColumn Header="Model" Width="120" Binding="{Binding Path=Model.name}" />