わかりました。C#WPFListViewコントロールでさらに問題が発生しています。ここにそれはすべての栄光にあります:
<Window x:Class="ebook.SearchResults" xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"Title="ISBNListView" Height="503" Width="1004">
<Grid>
<ListView Name="listView1" Margin"22,30,33,28" MouseDoubleClick="getSelectedItem" >
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="ISBN" Width="150" DisplayMemberBinding="{Binding ISBN}"/>
<GridViewColumn Header="Title" Width="350" DisplayMemberBinding="{Binding Title}"/>
<GridViewColumn Header="Author" Width="350" DisplayMemberBinding="{Binding Author}" />
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
</Grid>
ListViewに次の情報を入力しています。
XDocument xdoc = XDocument.Load(GlobalVars.docPath + "\\tempSearchResults.xml");
var items = from item in xdoc.Descendants("Book")
select new
{
ISBN = item.Element("ISBN").Value,
Title = item.Element("Title").Value,
AuthTexts = item.Element("Author").Value
};
foreach (var item in items)
{
listView1.Items.Add(new { ISBN = item.ISBN, Title = item.Title, Author = item.AuthTexts });
}
行をダブルクリックすると、行からデータを取得するのに時間がかかるのです。 DoubleClickは、行のすべてのデータを含むメッセージボックスをポップアップします。サブアイテムまたはセルのデータを1つだけ取得できないようです。行にISBN:1234567があるとします。タイトル:Hurrr作成者:Waldo、ISBNまたはタイトルだけを取得するにはどうすればよいですか。
private void getSelectedItem(object sender, MouseButtonEventArgs e)
{
System.Windows.MessageBox.Show(listView1.SelectedItems[0].ToString());
}
C#と.Netはまだ新しく、壁に頭をぶつけています。これはかなり単純なはずだと思います。
listView1.SelectedItems[0]
はobject
を返します。メンバーにアクセスする前に、まず特定のタイプにキャストするする必要があります。キャストするには、キャスト先のクラスの名前を知っている必要がありますが、匿名クラス(=名前はありません)のインスタンスをListViewに追加しています。
解決策:ISBN、Title、Authorプロパティを使用してクラス(例:Book
)を定義し、Book
のインスタンスをListViewに追加します。次に、必要なキャストを行うことができます。
private void getSelectedItem(object sender, MouseButtonEventArgs e)
{
Book book = (Book)listView1.SelectedItems[0];
System.Windows.MessageBox.Show(book.ISBN);
}
匿名タイプのインスタンスの代わりにBook
の場合、インスタンスをListViewに追加することを忘れないでください。
var items = from item in xdoc.Descendants("Book")
select new Book // <---
{
ISBN = (string)item.Element("ISBN"),
Title = (string)item.Element("Title"),
Author = (string)item.Element("Author"),
};
foreach (var item in items)
{
listView1.Items.Add(item);
}
var items = from item in xdoc.Descendants("Book")
select new Book() // <---
{
ISBN = (string)item.Element("ISBN"),
Title = (string)item.Element("Title"),
Author = (string)item.Element("Author"),
};
foreach (var item in items)
{
listView1.Items.Add(item);
}
上記のコードで問題が発生しました。一度使用すると、listViewにこれらの値が表示されませんでした。それが役立つかどうか、またはそれが正しいかどうかはわかりませんが、いくつかのテストの後、「新しい本を選択」の後に()を追加すると、ListViewですべてのフィールドが正しく表示されます。