1

私は以下のようにデータベースから来て、いくつかのデータにバインドされた1つのグリッドと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"/>

TblSpareParts1つの列だけが呼ばれる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

UIデザインに問題があると思います。で結合されたテーブルを操作DataGridすると、重複したデータが確実に取得されます。これは、回避する必要がある場合があります。より良い解決策は、モデル テーブル用に 1 つ、モデルに関連するアイテム用に2 つDataGridの s または (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;}
}

ここでは、2 番目に行ったように実行できます。Items テーブルのみをロードするDataGridことで、Model Name プロパティを指す列を追加できます。EF が提供する遅延読み込みにより、表示する準備が整います。

  <DataGridTextColumn Header="Model" Width="120" Binding="{Binding Path=Model.name}" />
于 2013-09-05T07:13:46.057 に答える
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 に答える