1

我有一个与一些数据绑定的网格,来自数据库,如下所示和一个编辑按钮

<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功能上

4

2 回答 2

0

当你这样做时select new { s.SPartName, s.SPartCode, s.SPartLocation, s.SPartID, m.ModelName },你返回一个匿名类型,而不是TblSparePart对象。

这就是铸件SParts_grid.SelectedItem as TblSparePart;返回的原因null

于 2013-09-05T06:49:40.867 回答
0

我认为你有一个 UI 设计问题。使用连接表DataGrid肯定会得到重复的数据,这就是您可能必须避免的。更好的解决方案是使用两个DataGrids 或 (ComboBox和 a DataGrid) 一个用于模型表,另一个用于与模型相关的项目。

如果您正在使用实体框架,那么任务会容易得多。您只需将绑定指向相关的模型表。
看看这个案例:

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;}
}

在这里,您可以像第二次那样做。通过仅加载 Items 表,您DataGrid可以添加指向 Model Name 属性的列。由于 EF 提供的延迟加载,它将准备好显示。

  <DataGridTextColumn Header="Model" Width="120" Binding="{Binding Path=Model.name}" />
于 2013-09-05T07:13:46.057 回答