简体   繁体   English

从WPF ListView导出数据Visual Studio 2017

[英]Exporting Data from wpf listview Visual Studio 2017

I am working on converting a GUI written in another language into a WPF project using VS 2017 (new to doing it this way). 我正在使用VS 2017将用另一种语言编写的GUI转换为WPF项目(这种方式的新功能)。 I have all of the controls created successfully, and the background code working, with the exception of the listview. 除了listview之外,我已经成功创建了所有控件,并且运行了后台代码。 The flow of the app is the end user fills in various fields, which populate the listview. 应用程序的流程是最终用户填写各个字段,这些字段将填充列表视图。 Then the listview exports all content to a csv file. 然后,列表视图将所有内容导出到一个csv文件。 Below is how I set up the listview: 下面是我如何设置列表视图:

        <ListView x:Name="lstOut" ScrollViewer.HorizontalScrollBarVisibility="Visible" HorizontalAlignment="Left" Height="205" Margin="10,394,0,0" VerticalAlignment="Top" Width="1294">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
                <GridViewColumn Header="CPU" DisplayMemberBinding="{Binding CPU}"/>
                <GridViewColumn Header="RAM" DisplayMemberBinding="{Binding RAM}"/>
                <GridViewColumn Header="IP Address" DisplayMemberBinding="{Binding IP}"/>
                <GridViewColumn Header="Subnet" DisplayMemberBinding="{Binding Subnet}"/>
                <GridViewColumn Header="Port Group" DisplayMemberBinding="{Binding PortGroup}"/>
                <GridViewColumn Header="Gateway" DisplayMemberBinding="{Binding Gateway}"/>
                <GridViewColumn Header="DNS" DisplayMemberBinding="{Binding DNS}"/>
                <GridViewColumn Header="Description" DisplayMemberBinding="{Binding Description}"/>
                <GridViewColumn Header="Template" DisplayMemberBinding="{Binding Template}"/>
                <GridViewColumn Header="Host" DisplayMemberBinding="{Binding Host}"/>
                <GridViewColumn Header="Site Code" DisplayMemberBinding="{Binding Site}"/>
                <GridViewColumn Header="Folder" DisplayMemberBinding="{Binding Folder}"/>
                <GridViewColumn Header="DataStore" DisplayMemberBinding="{Binding Datastore}"/>
                <GridViewColumn Header="Patch Method" DisplayMemberBinding="{Binding Patch}"/>
                <GridViewColumn Header="HDD1 Size" DisplayMemberBinding="{Binding HDD1Size}"/>
                <GridViewColumn Header="HDD1 Format" DisplayMemberBinding="{Binding HDD1Format}"/>
                <GridViewColumn Header="HDD2 Size" DisplayMemberBinding="{Binding HDD2Size}"/>
                <GridViewColumn Header="HDD2 Format" DisplayMemberBinding="{Binding HDD2Format}"/>
                <GridViewColumn Header="HDD3 Size" DisplayMemberBinding="{Binding HDD3Size}"/>
                <GridViewColumn Header="HDD3 Format" DisplayMemberBinding="{Binding HDD3Format}"/>
                <GridViewColumn Header="HDD4 Size" DisplayMemberBinding="{Binding HDD4Size}"/>
                <GridViewColumn Header="HDD4 Format" DisplayMemberBinding="{Binding HDD4Format}"/>
                <GridViewColumn Header="HDD5 Size" DisplayMemberBinding="{Binding HDD5Size}"/>
                <GridViewColumn Header="HDD5 Format" DisplayMemberBinding="{Binding HDD5Format}"/>
            </GridView>
        </ListView.View>
    </ListView>        

I then created a class on the project to get and set the columns based on the data entered by the user: 然后,我在项目上创建了一个类,以根据用户输入的数据获取并设置列:

    public class MyItem
{
    public string Name { get; set; }
    public int CPU { get; set; }
    public int RAM { get; set; }
    public string IP { get; set; }
    public string Subnet { get; set; }
    public string PortGroup { get; set; }
    public string Gateway { get; set; }
    public string DNS { get; set; }
    public string Description { get; set; }
    public string Template { get; set; }
    public string Host { get; set; }
    public string Site { get; set; }
    public string Folder { get; set; }
    public string Datastore { get; set; }
    public string Patch { get; set; }
    public int HDD1Size { get; set; }
    public string HDD1Format { get; set; }
    public int HDD2Size { get; set; }
    public string HDD2Format { get; set; }
    public int HDD3Size { get; set; }
    public string HDD3Format { get; set; }
    public int HDD4Size { get; set; }
    public string HDD4Format { get; set; }
    public int HDD5Size { get; set; }
    public string HDD5Format { get; set; }
}

To test this, under the main window initialization I added the following: 为了测试这一点,在主窗口初始化下添加了以下内容:

            this.lstOut.Items.Add(new MyItem {
            Name = "SPMASV-KL16SQD1", CPU = 4, RAM = 8192, IP = "10.10.40.79", Subnet = "255.255.252.0", PortGroup = "Server231",
            Gateway = "10.10.40.254", DNS = "10.10.40.69", Description = "Testing", Template = "OAK 2016 Template", Host = "LAX",
            Site = "LAX", Folder = "Servers", Datastore = "OakStorMagic", Patch = "Patch Reboot", HDD1Size = 320, HDD1Format = "Thick",
            HDD2Size = 200, HDD2Format = "Thin", HDD3Size = 60, HDD3Format = "Thick", HDD4Size = 500, HDD4Format = "Thin",
            HDD5Size = 1350, HDD5Format = "EagerZeroedThick"
        });

This populates the listview as I would expect. 如我所愿,这将填充列表视图。 The problem comes in exporting the data once the user clicks the appropriate button. 问题在于用户单击相应的按钮后导出数据。 I have been looking at the ListView Class page on MSDN for an easy way to both read a single column, AND to export the entire contents as an array, but am not having any luck. 我一直在查看MSDN上的ListView类页面,这是一种既可以读取单个列,又可以将整个内容导出为数组的简便方法的方法,但是运气不佳。 I would think, the way I created it, I could either access the item structure through typical . 我想,以我创建它的方式,我可以通过Typical访问项目结构。 notation (eg lstOut.Name) or convert all of it into an array and iterate through, but am not coming up with an easy way to do either. 表示法(例如lstOut.Name)或将其全部转换为数组并进行迭代,但都没有提出一种简单的方法来实现。

Just looking for a nudge in the right direction, if anyone has any suggestions on an easy way to accomplish this. 如果有人对实现此目标的简单方法有任何建议,则只是寻找正确方向的微动。 Any assistance would be appreciated. 任何援助将不胜感激。

You may want to take advantage of WPF binding system. 您可能想利用WPF绑定系统。 Consider the following simple sample built from your code: 考虑以下从您的代码构建的简单示例:

XAML: XAML:

<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:wpfTest="clr-namespace:WpfTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">


    <Grid Background="DimGray" Name="Grid">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <ListView x:Name="lstOut" ScrollViewer.HorizontalScrollBarVisibility="Visible" HorizontalAlignment="Left"
                   VerticalAlignment="Top" 
                  ItemsSource="{Binding MyItems}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
                    <GridViewColumn Header="CPU" DisplayMemberBinding="{Binding CPU}" />
                    <GridViewColumn Header="RAM" DisplayMemberBinding="{Binding RAM}" />
                    <GridViewColumn Header="IP Address" DisplayMemberBinding="{Binding IP}" />
                    <GridViewColumn Header="Subnet" DisplayMemberBinding="{Binding Subnet}" />
                    <GridViewColumn Header="Port Group" DisplayMemberBinding="{Binding PortGroup}" />
                    <GridViewColumn Header="Gateway" DisplayMemberBinding="{Binding Gateway}" />
                    <GridViewColumn Header="DNS" DisplayMemberBinding="{Binding DNS}" />
                    <GridViewColumn Header="Description" DisplayMemberBinding="{Binding Description}" />
                    <GridViewColumn Header="Template" DisplayMemberBinding="{Binding Template}" />
                    <GridViewColumn Header="Host" DisplayMemberBinding="{Binding Host}" />
                    <GridViewColumn Header="Site Code" DisplayMemberBinding="{Binding Site}" />
                    <GridViewColumn Header="Folder" DisplayMemberBinding="{Binding Folder}" />
                    <GridViewColumn Header="DataStore" DisplayMemberBinding="{Binding Datastore}" />
                    <GridViewColumn Header="Patch Method" DisplayMemberBinding="{Binding Patch}" />
                    <GridViewColumn Header="HDD1 Size" DisplayMemberBinding="{Binding HDD1Size}" />
                    <GridViewColumn Header="HDD1 Format" DisplayMemberBinding="{Binding HDD1Format}" />
                    <GridViewColumn Header="HDD2 Size" DisplayMemberBinding="{Binding HDD2Size}" />
                    <GridViewColumn Header="HDD2 Format" DisplayMemberBinding="{Binding HDD2Format}" />
                    <GridViewColumn Header="HDD3 Size" DisplayMemberBinding="{Binding HDD3Size}" />
                    <GridViewColumn Header="HDD3 Format" DisplayMemberBinding="{Binding HDD3Format}" />
                    <GridViewColumn Header="HDD4 Size" DisplayMemberBinding="{Binding HDD4Size}" />
                    <GridViewColumn Header="HDD4 Format" DisplayMemberBinding="{Binding HDD4Format}" />
                    <GridViewColumn Header="HDD5 Size" DisplayMemberBinding="{Binding HDD5Size}" />
                    <GridViewColumn Header="HDD5 Format" DisplayMemberBinding="{Binding HDD5Format}" />
                </GridView>
            </ListView.View>
        </ListView>

        <Button Grid.Row="1" Content="Add new" Click="AddNew"/>

        <Button Grid.Row="2" Content="Export" Click="Export"/>
    </Grid>
</Window>

You can see that the window's data context is set to itself, also you bind your listview's itemsource property to a collection which should be a property in your viewmodel (in this case since we are setting the datacontext to Self, the viewmodel is our window itself). 您可以看到窗口的数据上下文已设置为自身,也将列表视图的itemsource属性绑定到了一个集合,该集合应该是您的viewmodel中的属性(在这种情况下,因为我们将datacontext设置为Self,因此viewmodel是我们的窗口本身)。 Then in codebehind: 然后在代码背后:

using System.Collections.ObjectModel;
using System.Windows;

namespace WpfTest
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
            AddNew(null, null);
        }

        public ObservableCollection<MyItem> MyItems { get; set; } = new ObservableCollection<MyItem>();

        private void AddNew(object sender, RoutedEventArgs e)
        {
            MyItems.Add(new MyItem
            {
                Name = "SPMASV-KL16SQD1",
                CPU = 4,
                RAM = 8192,
                IP = "10.10.40.79",
                Subnet = "255.255.252.0",
                PortGroup = "Server231",
                Gateway = "10.10.40.254",
                DNS = "10.10.40.69",
                Description = "Testing",
                Template = "OAK 2016 Template",
                Host = "LAX",
                Site = "LAX",
                Folder = "Servers",
                Datastore = "OakStorMagic",
                Patch = "Patch Reboot",
                HDD1Size = 320,
                HDD1Format = "Thick",
                HDD2Size = 200,
                HDD2Format = "Thin",
                HDD3Size = 60,
                HDD3Format = "Thick",
                HDD4Size = 500,
                HDD4Format = "Thin",
                HDD5Size = 1350,
                HDD5Format = "EagerZeroedThick"
            });
        }

        private void Export(object sender, RoutedEventArgs e)
        {
            foreach (var myItem in MyItems)
            {
                //do whatever you need to export your data...
            }
        }
    }
}

When you click the Export button you can iterate through your collection containing instances of your model, which is represented by MyItem class. 单击“导出”按钮时,可以遍历包含模型实例的集合,该集合由MyItem类表示。

Thanks, while this wasn't exactly what I was looking for it gave me a push in the right direction. 谢谢,虽然这并非我真正想要的,但它为我朝着正确的方向迈进了一步。 I was able to figure out what I needed to do. 我能够弄清楚我需要做什么。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM