【C#,WinForms】XMLデータをListViewに表示し、チェック項目のみXML保存させる

公開日: : 最終更新日:2015/10/20 Blog, Microsoft ,

MSDNフォーラムの以下についてサンプルを組んだので掲載。

ListViewでチェックされた値をXMLファイルから読み込む方法

XMLから読み込んだ独自クラスのリストをListViewに表示。
保存ボタン押下時にチェックされている項目のみをXMLに保存する。
Xmlの保存はXmlSerializerを使った。
※パスの存在チェックなどは行っていないので注意

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        listView1.GridLines = true;
        listView1.View = View.Details;
        listView1.Columns.Add("FullName");
        listView1.Columns.Add("Age");
        listView1.CheckBoxes = true;

        foreach(var user in LoadUser())
        {
            listView1.Items.Add(new UserItem(user));
        }
    }

    private const string filePath = @"C:\hoge\hoge.xml";

    private List<User> LoadUser()
    {
        var serializer = new XmlSerializer(typeof(List<User>));
        if(!File.Exists(filePath))
        {
            var newUsers = new List<User>();
            newUsers.Add(new User() { FullName = "田中1", Age = 20, Address = "千葉1" });
            newUsers.Add(new User() { FullName = "田中2", Age = 21, Address = "千葉2" });
            newUsers.Add(new User() { FullName = "田中3", Age = 22, Address = "千葉3" });
            return newUsers;
        }
        using(var reader = new StreamReader(filePath))
        {
            return (List<User>)serializer.Deserialize(reader);
        }
    }

    private void SaveUser(List<User> users)
    {
        var serializer = new XmlSerializer(typeof(List<User>));
        using(var writer = new StreamWriter(filePath))
        {
            serializer.Serialize(writer, users);
        }
    }

    private class UserItem : ListViewItem
    {
        public UserItem(User args) 
        {
            this.Text = args.FullName;
            this.SubItems.Add(args.Age.ToString());
            this.Tag = args;
        }
        public User GetUser()
        {
            return (User)this.Tag;
        }
    }

    public class User
    {
        public string FullName { get; set; }
        public int Age { get; set; }
        public string Address { get; set; }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var saveUsers = new List<User>();
        foreach(UserItem current in listView1.CheckedItems)
        {
            saveUsers.Add(current.GetUser());
        }
        SaveUser(saveUsers);
        Console.WriteLine("保存しました.");
    }
}

WPFだと思いこんで一発目の回答でWPFのコードを提示してしまった。反省。
次回にWPFのコードも一応残しておこう。

関連記事

Visual Studio から Android SDK Managerが起動できない

Android SDKやエミュレーターイメージのアップデートを行いたい場合にAndroid SDK

記事を読む

no image

【.NET】正規表現の復習

正規表現エンジン System.Text.RegularExpressions.Regexオブジェ

記事を読む

IntelliTestはどこまでカバーしてくれるのか

私はレガシーな開発環境・案件が多かったのですが、 この頃、ユニットテストを利用する機会が増えてきま

記事を読む

no image

SmallBasicで拡張ライブラリを使用する

こんにちは。 teratailにて以下の質問に遭遇しまして。 small basic の 拡

記事を読む

Flowで毎月の定期タスク設定

Flow を使い始めてみた。 Requrrenceで時間をトリガーにすることが出来るがSecond

記事を読む

【XAML】フォントサイズを自動縮小して全体を表示

Viewboxを親にするだけ。 拡大・縮小方法はStretch, StretchDirec

記事を読む

no image

Xamarin.Forms で ScrollView の中に Map を配置したとき、Androidで地図のスクロールが出来なくなる

iOSは問題ないけど、AndroidはScrollViewにタッチを持ってかれてる感じ。 カスタ

記事を読む

【iPhoneアプリ】多言語対応させる1

iPhoneアプリを多言語対応(iPhone端末の言語設定によってアプリケーションの言語も切り替える

記事を読む

拡張温度に対応した Windows 10 IoT Core ボード

Windows 10 IoT Core 対応ボード その2 こっちは拡張温度対応している。 Ban

記事を読む

no image

【TFS2013】Visual Studio 2005 Professional から TFS2013へ接続

こんにちは。 私の周りではいまだにレガシーな開発環境を使いつづけているプロジェクトが多いです。

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

PAGE TOP ↑