0

ListViewコントロールも含むコントロールを取得しましたGridView。データは、データベース データベース スキームの別のテーブルから来ています:

  1. 本 (BookID、BookName、ISBN、CopyLeft);
  2. 借り手 (BorrowerID、BorrowerName、BorrowerLevel);
  3. トランザクション (TransactionID、BorrowerID、BookID、BorrowDate、ReturnDate、IsReturned);

対応するクラスはBook、それぞれ 、BorrowerおよびTransactionです。 データ バインディングを使用して、これらのテーブルから、、、、、およびをGridViewフェッチ します。XAML コード:TransactionIDBorrowerIDBorrowerNameBookNameBorrowDateReturnDate

 <Grid>
    <ListView Margin="15,57,58,57" Name="borrowedBookList" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding }" KeyDown="borrowedBookList_KeyDown">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn  Width="80" Header="Borrower ID" DisplayMemberBinding="{Binding Path=BorrowerID}"/>
                    <GridViewColumn Width="220" Header="Borrower Name" DisplayMemberBinding="{Binding Path=BorrowerName}"/>
                    <GridViewColumn Width="220" Header="Book Name" DisplayMemberBinding="{Binding Path=BookName}"/>
                    <GridViewColumn Width="100" Header="Date" DisplayMemberBinding="{Binding Path=BorrowDate}"/>
                    <GridViewColumn Width="100" Header="Return Date" DisplayMemberBinding="{Binding Path=ReturnDate}"/>
                   </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>
    <Label Content="Borrowed Book List" Height="34" HorizontalAlignment="Left" Margin="310,12,0,0" Name="label1" VerticalAlignment="Top" Width="151" />
    <Button Content="Close" Height="31" HorizontalAlignment="Left" Margin="636,535,0,0" Name="close" VerticalAlignment="Top" Width="106" Click="close_Click"/>
    <Button Content="Return This Book" Height="31" HorizontalAlignment="Left" Margin="454,535,0,0" Name="return" VerticalAlignment="Top" Width="115" Click="return_Click"/>
</Grid>

Transaction行をorのオブジェクトとして選択できますBookBorrower? Transactions私の目的は、行を選択し、Booksテーブルの対応するエントリを特定し、値を増やして属性CopyLeftに「YES」を割り当てることです。IsReturnedでは、どうすればこれを行うことができますか?

さらに、次のようにコーディングしようとしました:

var selectedTran = this.borrowedBookList.selectedItem as Transaction;
var selectedBook=this.borrowedBookList.selectedItem as Book;
try
{
    selectedBook.CopyLeft++;
    selectedTran.isReturned="YES";
}
catch(Exception ex)
{
    MessageBox.Show(ex.message);
}

例外は、「オブジェクト参照がオブジェクトのインスタンスに設定されていない」ことを示しています。次に、次のようにboredBookListのタイプを見つけようとしました:

MessageBox.Show(borrowedBookList.SelectedItem.GetType().ToString());

匿名のタイプを示します。

4

1 に答える 1

0

あなたのクエリはおそらく匿名タイプの結果になります:

    var query = from b in ctx.books 
                ... 
                select new 
                { BorrowerID = b.ID, BorrowerName = b.Name , ... 
                }

グリッドの selectedItem プロパティには、元のエンティティ クラスではなく、このタイプが含まれています。したがって、主キーIDを含める必要がある名前付きクラスを使用し、選択した項目の主キーを使用して対応するエンティティを更新します:

public class ForYourGrid
{
    public int BorrowerID { get; set; }
    public string BorrowerName { get; set; }
...
}

    var query2 = from b in ctx.books 
                ... 
                select new ForYourGrid 
                { BorrowerID = b.ID, BorrowerName = b.Name , ... 
                }


    var selected = this.borrowedBookList.selectedItem as ForYourGrid;

    var selectedTran = ctx.Transactions.SingleOrDefault(e => e.TransactionID == selected.TransactionID);
    selectedTran.isReturned = "YES";

    var selectedBook = ctx.Books.SingleOrDefault(e => e.BookID == selected.BookID);
    selectedBook.CopyLeft++;

    ctx.SaveChanges();
于 2012-09-18T15:46:11.067 に答える