背景
それはすべて、電話帳の機能を実行するはずの簡単なプログラムを書き始めたという事実から始まりました。 すべてのデータが配置されるメインコンポーネントとして、ListViewクラスのオブジェクトを選択しました。 ただし、適切なプログラムであれば、すべてのデータを別のファイルに保存し、その後のダウンロードでデータの操作を継続できる必要があります。
車輪を再発明しないために、データをXMLファイルに保存することにしました。 このタイプのファイルは非常に便利で、多くの開発者に人気があり、簡単に操作できます。 唯一の欠点は、データセキュリティが弱いことです。 テキスト暗号化を適用できますが、任意のシンプルなテキストエディターで開くことができます-これはファイル内の情報の完全なセキュリティを保証するものではありません。
データをエクスポートするには?
![画像](https://habrastorage.org/files/f4e/65f/899/f4e65f8992904214bf356cc2b5672c61.jpg)
スクリーンショットからわかるように、メニュー項目「ファイル」では、すべてが電話帳のエクスポートとインポートのためにすでに準備されているため、コード自体を記述する必要があります。
このプログラムを書いているとき、.NETプラットフォームのC#でXMLファイルを操作した実際の経験はまだありませんでした。 そのため、インターネットで資料を探し始めました。 しかし、私の検索結果はすべて快適ではありませんでした。 見つかったすべての結果から、非常に大まかな「パスタ」コードが生成され、ニーズに合わせて調整できます。 ただし、これはまだ実用的ではありません。 このようなコードは、さまざまなプロジェクトで簡単に使用することはできません。
その後、C#でXMLファイルを操作することの非常に特殊性を詳しく調べることにしました。
適応コード
私は、ミハイル・フレノフによって書かれたC#言語の教科書「The Bible C# 。2nd edition 」に注目しました。 彼の本では、著者はクラスの完全な使用を推奨し、主張しています。 また、XMLファイルの操作に関するトピックでは、エクスポートとインポートのために、これは「適切な」メソッドを使用します。これは、それが機能するオブジェクトのクラスメソッドです。
このメソッドは、使用するオブジェクトのクラスを個人的に記述するという条件で非常に優れています。 しかし、既製のクラスを使用する場合はどうでしょうか? たとえば、 ListViewまたはDatagridviewクラスでは、それらを(個人的に)作成しませんでしたが、多くの場合、それらを使用します。
この時点で、いつでも使用できる独自のクラスを作成する必要があることに気付きました。 そのため、(将来)さまざまなパラメーターの説明に時間を費やす必要はありません。 クラスのメソッドを再定義するか、単に変更するだけです。
XMLを操作するためのクラス
XMLクラスコード
public class Stroka { public void Main(string el1, string el2, string el3, string el4) { El1 = el1; El2 = el2; El3 = el3; El4 = el4; } public string El1 { get; set; } public string El2 { get; set; } public string El3 { get; set; } public string El4 { get; set; } public void SaveToFile(XmlTextWriter xmlOut) { xmlOut.WriteStartElement(""); xmlOut.WriteAttributeString("1", El1.ToString()); xmlOut.WriteAttributeString("2", El2.ToString()); xmlOut.WriteAttributeString("3", El3.ToString()); xmlOut.WriteAttributeString("4", El4.ToString()); xmlOut.WriteEndElement(); } public void LoadFromFile(XmlTextReader xmlin) { try { El1 = xmlin.GetAttribute("1"); El2 = xmlin.GetAttribute("2"); El3 = xmlin.GetAttribute("3"); El4 = xmlin.GetAttribute("4"); } catch(Exception) { } } }
このクラスが機能するには、さらに2つのアセンブリを接続する必要があります。
using System.IO; using System.Xml;
クラスを「 Stroka 」と呼ぶことにしました。これは、ループ内でテーブル内のすべての行を反復処理するためです。 また、コードのすべての部分に4つの部分が記載されていることに注意してください。 これは意図的に行われます。 要素の数は、表の列の数と一致する必要があります。
クラスの準備ができているので、プロジェクトでそれを削減し、もはや調査することはできません。
美しい輸出(保全)
急いで仕事を終わらせないでください。 さらに、保存用のダイアログボックスを呼び出すことができるコードの行をさらに記述します。
![画像](https://habrastorage.org/files/ec1/424/54a/ec142454a2a04c29871416c12e3b2adf.jpg)
このウィンドウは、次のコードで呼び出すことができます。
ウィンドウ呼び出しコード
private void ToolStripMenuItem_Click(object sender, EventArgs e) { int count = listView1.Items.Count; if (count == 0) { MessageBox.Show(" . ."); return; } if (filename == "") { SaveFileDialog fileDialog = new SaveFileDialog(); fileDialog.Title = ""; fileDialog.Filter = "XML files|*.xml"; if (fileDialog.ShowDialog() != DialogResult.OK) return; filename = fileDialog.FileName; Export(); } }
お気づきかもしれませんが、これは既にデータをXMLファイルにエクスポートする方法です。 しかし、ここでは興味深いことは何も起こりません。エクスポート用のウィンドウのみが呼び出され、そのパスが変数「 filename 」に書き込まれます 。 これは、プロジェクトの最初に作成される通常の文字列変数です。
次のようになります。
例
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Xml; namespace TestPhoneBook { public partial class MainWindow : Form { string filename = ""; public MainWindow() { InitializeComponent(); } ...
エクスポート自体は、「Export();」メソッドで実行されます。
時間メソッド「Export();」
エクスポート()メソッドコード
public void Export() { // xml- FileStream fs = new FileStream(filename, FileMode.Create); XmlTextWriter xmlOut = new XmlTextWriter(fs, Encoding.Unicode); xmlOut.Formatting = Formatting.Indented; // xmlOut.WriteStartDocument(); xmlOut.WriteComment(" . "); xmlOut.WriteComment(" : "); // xmlOut.WriteStartElement("PhoneBook"); xmlOut.WriteAttributeString("Version", "1.0.0"); // int count = listView1.Items.Count; for (int t = 0; t < count; t++) { ListViewItem item = listView1.Items[t]; Stroka stroka = new Stroka(); stroka.Main(item.SubItems[0].Text, item.SubItems[1].Text, item.SubItems[2].Text, item.SubItems[3].Text); stroka.SaveToFile(xmlOut); } // xmlOut.WriteEndElement(); xmlOut.WriteEndDocument(); // xmlOut.Close(); fs.Close(); }
このコードのほとんどが「テンプレート」であることに注意することが重要です。このクラスを使用するプロジェクトの多くでは、「すべての要素を列挙するサイクル」が常に唯一の特徴です。 データをエクスポートする「テーブル」によって異なります。 この場合、データはListViewクラスのオブジェクトから取得されます。
行に注意してください:
Stroka stroka = new Stroka(); stroka.Main(item.SubItems[0].Text, item.SubItems[1].Text, item.SubItems[2].Text, item.SubItems[3].Text);
クラス(私たちの) Strokaのオブジェクトを作成し、そのMainメソッドに(4列の)行の要素を配置します。
エクスポート完了
![画像](https://habrastorage.org/files/618/1c1/7d5/6181c17d5e79496fb8b8843e04f6c97b.jpg)
作成したXMLファイルをメモ帳で開き、ファイル構造とコードを比較できます。
また、このクラスを使用すると、アプリケーションにデータをインポートできます。 データが元々プログラムにあるかのように、編集したり、他の作業を行ったりすることもできます。
しかし、それについては別の出版物で詳しく説明しています。