17

好的,我的 C# WPF ListView 控件有更多问题。这是它的所有荣耀:

<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 确实会弹出一个消息框,其中包含行中的所有数据,但我似乎无法仅获取一个子项或单元格的数据。假设一行有 ISBN:1234567 标题:Hurrr 作者:Waldo,我如何仅检索 ISBN 或仅检索标题?

private void getSelectedItem(object sender, MouseButtonEventArgs e)
    {
        System.Windows.MessageBox.Show(listView1.SelectedItems[0].ToString());
    }

对 C# 和 .Net 仍然很陌生,我的头撞到了墙上。我认为这应该很简单。

4

3 回答 3

31

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

不要忘记添加实例 ifBook到 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);
}
于 2009-09-10T00:57:29.817 回答
1

只是想更清楚地使用代码

获取所选项目

XAML:

<ListView Name="TheList" SelectionChanged="TheList_SelectionChanged"/>

CS:

private void TheList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    MyItemClass SelectedItem = (MyItemClass)TheList.SelectedItem;

    if (SelectedItem != null)
        MessageBox.Show(SelectedItem.Title);
}

而对于双击项目(几乎相同)

XAML:

<ListView Name="TheList" MouseDoubleClick="TheList_MouseDoubleClick"/>

CS:

private void TheList_SelectionChanged(object sender, MouseButtonEventArgs e)
{
    MyItemClass SelectedItem = (MyItemClass)TheList.SelectedItem;

    if (SelectedItem != null)
        MessageBox.Show(SelectedItem.Title);
}
于 2020-08-04T18:32:57.967 回答
0
    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 可以为我正确显示所有字段。

于 2016-01-29T10:33:48.773 回答