2017-12-20 20 views
0

私は別の言語で書かれたGUIをVS2017を使ってWPFプロジェクトに変換しようとしています。リストビューを除いて、すべてのコントロールが正常に作成され、バックグラウンドコードが機能しています。アプリの流れは、エンドユーザがさまざまなフィールドに入力して、リストビューに入力します。リストビューはすべてのコンテンツをcsvファイルにエクスポートします。以下は、私がリストビューを設定する方法です:wpf listviewからのデータのエクスポートVisual Studio 2017

 <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>   

私は、ユーザーが入力したデータに基づいて列を取得および設定するためのプロジェクトにクラスを作成しました:

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

これをテストするには、メインウィンドウの初期化で、次のように追加しました:

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

これは私が期待しているようにリストビューに値を設定します。問題は、ユーザーが適切なボタンをクリックするとデータをエクスポートすることにあります。私はMSDNのListViewクラスのページを見て、1つの列を読み込み、内容全体を配列としてエクスポートする簡単な方法を探していましたが、何の不運もありません。私が作成した方法では、典型的な方法でアイテム構造にアクセスすることができたと思います。表記法(例:lstOut.Name)を使用するか、すべてを配列に変換して繰り返し処理しますが、どちらかを簡単に実行できるわけではありません。

誰かが簡単にこれを達成するための提案を持っている場合、ちょうど正しい方向にナッジを探しています。いかなる援助も感謝します。

答えて

0

WPFバインディングシステムを利用できます。

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> 

あなたは、ウィンドウのデータコンテキストが自身に設定されていることを見ることができ、また、あなたがする必要がありますコレクションにあなたのリストビューのitemsourceプロパティをバインド(この場合、datacontextをSelfに設定するので、viewmodelはウィンドウ自体です)。その後、分離コードで:

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... 
      } 
     } 
    } 
} 

あなたはMYITEMクラスによって表され、モデルのインスタンスを含むあなたのコレクションを反復処理することができますエクスポート]ボタンをクリックします。

0

これは正確には私が探していたものではありませんでしたが、それは私に正しい方向へのプッシュを与えました。私は何をする必要があるのか​​把握することができました。

関連する問題