L2DBForm.xaml.cs Source CodeL2DBForm.xaml.cs Source Code

このトピックでは、L2DBForm.xaml.cs ファイルの C# ソース コードの内容と説明を示します。This topic contains the contents and description of the C# source code in the file L2DBForm.xaml.cs. このファイルに含まれている L2XDBForm 部分クラスは、3 つの論理的な部分、つまりデータ メンバー、OnRemoveOnAddBook ボタン クリック イベント ハンドラーに分けることができます。The L2XDBForm partial class contained in this file can be divided into three logical sections: data members and the OnRemove and OnAddBook button click event handlers.

データ メンバーData Members

このクラスを L2DBForm.xaml で使用されているウィンドウ リソースに関連付けるために、2 つのプライベート データ メンバーが使用されています。Two private data members are used to associate this class to the window resources used in L2DBForm.xaml.

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

  • メンバー bookList は、コンストラクター内で次の行を使用して L2DBForm.xaml 内の CDATA 文字列に初期化されます。The member bookList is initialized in the constructor to the CDATA string in L2DBForm.xaml with the following line:

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

OnAddBook イベント ハンドラーOnAddBook Event Handler

このメソッドには次の 3 つのステートメントが含まれています。This method contains the following three statements:

  • 最初の条件ステートメントでは、入力が検証されます。The first conditional statement is used for input validation.

  • 2 番目のステートメントでは、[Add New Book](新しい書籍の追加) ユーザー インターフェイス (UI) セクションでユーザーが入力した文字列値から新しい XElement が作成されます。The second statement creates a new XElement from the string values the user entered in the Add New Book user interface (UI) section.

  • 最後のステートメントでは、この新しい書籍要素が、L2DBForm.xaml のデータ プロバイダーに追加されます。The last statement adds this new book element to the data provider in L2DBForm.xaml. その結果、動的なデータ バインドによって UI がこの新しい項目で自動的に更新されます。ユーザーがコードを追加する必要はありません。Consequently, dynamic data binding will automatically update the UI with this new item; no extra user-supplied code is required.

OnRemove イベント ハンドラーOnRemove Event Handler

OnRemove ハンドラーは、2 つの理由で OnAddBook ハンドラーよりも複雑です。The OnRemove handler is more complicated than the OnAddBook handler for two reasons. 1 つは、生の XML に保持された空白が含まれているために、一致する改行を書籍エントリと共に削除する必要があることです。First, because the raw XML contains preserved white space, matching newlines must also be removed with the book entry. もう 1 つは、削除された項目に設定されていた選択が、便宜上、一覧の前の項目にリセットされることです。Second, as a convenience, the selection, which was on the deleted item, is reset to the previous one in the list.

ただし、選択された書籍項目を削除するための中心的な作業は、2 つのステートメントだけで完了します。However the core work of removing the selected book item is accomplished by only two statements:

  • まず、リスト ボックスで現在選択されている項目に関連する書籍要素が取得されます。First, the book element associated with the currently selected item in the list box is retrieved:

    XElement selBook = (XElement)lbBooks.SelectedItem;   
    
  • 次に、この要素がデータ プロバイダーから削除されます。Then, this element is deleted from the data provider:

    selBook.Remove();  
    

    この場合も、動的なデータ バインドによってプログラムの UI が自動的に更新されます。Again, dynamic data binding assures that the program's UI is automatically updated.

Example

説明Description

コードCode

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

コメントComments

これらのハンドラーに関連する XAML ソースについては、「L2DBForm.xaml ソース コード」を参照してください。For the associated XAML source for these handlers, see L2DBForm.xaml Source Code.

関連項目See Also

チュートリアル: LinqToXmlDataBinding の例 Walkthrough: LinqToXmlDataBinding Example
L2DBForm.xaml ソース コードL2DBForm.xaml Source Code