次の方法で共有


L2DBForm.xaml.csのソースコード

このページには、L2DBForm.xaml.csファイル内の C# ソース コードの内容と説明が含まれています。 このファイルに含まれる L2XDBForm 部分クラスは、データ メンバーと OnRemoveOnAddBook ボタン クリック イベント ハンドラーの 3 つの論理セクションに分割できます。

データ メンバー

このクラスを、L2DBForm.xamlで使用されるウィンドウ リソースに関連付けるために、2 つのプライベート データ メンバーが使用されます。

  • myBooks 名前空間変数は、"http://www.mybooks.com"に初期化されます。

  • コンストラクターにおいて、次の行で メンバーは L2DBForm.xaml 内の CDATA 文字列に初期化されます。

    bookList = (XElement)((ObjectDataProvider)Resources["LoadedBooks"]).Data;
    

OnAddBook イベント ハンドラー

このメソッドには、次の 3 つのステートメントが含まれています。

  • 最初の条件ステートメントは、入力の検証に使用されます。

  • 2 番目のステートメントでは、ユーザーが 「Add New Book user interface (UI)」セクションに入力した文字列値から新しい XElement を作成します。

  • 最後のステートメントでは、この新しい book 要素を L2DBForm.xamlのデータ プロバイダーに追加します。 その結果、動的データ バインディングは、この新しい項目で UI を自動的に更新します。追加のユーザー指定コードは必要ありません。

OnRemove イベント ハンドラー

OnRemove ハンドラーは、2 つの理由から、OnAddBook ハンドラーよりも複雑です。 1 つは、生の XML に保持された空白が含まれているために、一致する改行を書籍エントリと共に削除する必要があることです。 2 つ目は、便宜上、削除済みアイテムにあった選択範囲が、リスト内の前の項目にリセットされます。

ただし、選択した書籍アイテムを削除する主要な作業は、次の 2 つのステートメントによってのみ実行されます。

  • まず、リスト ボックスで現在選択されている項目に関連付けられている book 要素が取得されます。

    XElement selBook = (XElement)lbBooks.SelectedItem;
    
  • その後、この要素はデータ プロバイダーから削除されます。

    selBook.Remove();
    

繰り返しになりますが、動的データ バインディングにより、プログラムの UI が自動的に更新されます。

コード

using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Xml;
using System.Xml.Linq;

namespace LinqToXmlDataBinding {
    /// <summary>
    /// Interaction logic for L2XDBForm.xaml
    /// </summary>

    public partial class L2XDBForm : System.Windows.Window
    {
        XNamespace mybooks = "http://www.mybooks.com";
        XElement bookList;

        public L2XDBForm()
        {
            InitializeComponent();
            bookList = (XElement)((ObjectDataProvider)Resources["LoadedBooks"]).Data;
        }

        void OnRemoveBook(object sender, EventArgs e)
        {
            int index = lbBooks.SelectedIndex;
            if (index < 0) return;

            XElement selBook = (XElement)lbBooks.SelectedItem;
            //Get next node before removing element.
            XNode nextNode = selBook.NextNode;
            selBook.Remove();

            //Remove any matching newline node.
            if (nextNode != null && nextNode.ToString().Trim().Equals(""))
            { nextNode.Remove(); }

            //Set selected item.
            if (lbBooks.Items.Count > 0)
            {  lbBooks.SelectedItem = lbBooks.Items[index > 0 ? index - 1 : 0]; }
        }

        void OnAddBook(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(tbAddID.Text) ||
                String.IsNullOrEmpty(tbAddValue.Text))
            {
                MessageBox.Show("Please supply both a Book ID and a Value!", "Entry Error!");
                return;
            }
            XElement newBook = new XElement(
                                mybooks + "book",
                                new XAttribute("id", tbAddID.Text),
                                tbAddValue.Text);
            bookList.Add("  ", newBook, "\r\n");
        }
    }
}

コメント

これらのハンドラーに関連付けられている XAML ソースについては、L2DBForm.xaml ソース コードを参照してください。

関連項目