Combo Box Items From an XML File |
|
Introduction |
When discussing file processing, we mentioned that it is sometimes necessary to automatically save a file when an application exits, without any intervention from the user. You can also solve this exact problem using XML. The ever growing strength of XML is in its ability to let modify a file however but still make that file usable by any environment that needs its content. We are going to create an XML file that holds a list of items for a combo box. Once the file exists, it can be processed or modified by any application that can read XML. We will load the file automatically when the application opens and retrieve the values of the elements to complete a combo box. While using the application, we will allow the user to change the list. When the application closes, we will retrieve the list of items from the combo box and update (in reality) recreate the list that includes the new items. |
Practical Learning: Using XML Values |
<?xml version="1.0" encoding="utf-8"?> <flavors> <flavor>French Vanilla</flavor> </flavors> |
|
/// <summary> /// This method is used to add a new item to the list. /// The item must be typed in the accompanying text box /// When the user clicks Add, the compiler checks if the item already exists in the list. /// If it does, the item is not added. /// </summary> private: System::Void btnAdd_Click(System::Object * sender, System::EventArgs * e) { String *NewItem = this->txtFlavor->Text; // If there is no flavor to add, do nothing if( NewItem->Equals(S"") == true ) return; // Since there is an item to add, prepare to add it // First make sure the item is not already in the list if( this->cboFlavors->FindStringExact(NewItem) > 0 ) { MessageBox::Show(String::Concat(NewItem, S" exists already in the list and will not be added.")); return; } // Since the item is not yet in the list, add it... this->cboFlavors->Items->Add(__try_cast<String *>(NewItem)); // After adding the item to the combo box, remove it from the text box this->txtFlavor->Text = S""; // And give focus to the text box in case the user wants to add another item this->txtFlavor->Focus(); } |
using namespace System::Xml; using namespace System::Text; |
/// <summary> /// This event opens an existing XML file. It then checks its elements. /// It retrieves the value of each element and uses them to fill out the combo box /// In this example, we don't check whether the file exists or not.<br> /// We simply assume that it exists. /// </summary> private: System::Void Form1_Load(System::Object * sender, System::EventArgs * e) { // Declare a variable of type XmlTextReader XmlTextReader *xtr = 0; // Declare a string that holds the name of the file String *fileName = S"ISFlavors.xml"; try { // Initialize the XmlTextReader variable with the name of the file xtr = new XmlTextReader(fileName); xtr->WhitespaceHandling = WhitespaceHandling::None; // Scan the XML file while (xtr->Read()) { // every time you find an element, find out what type it is switch (xtr->NodeType) { case XmlNodeType::Text: // If you find text, put it in the combo box' list this->cboFlavors->Items->Add(xtr->Value); break; } } // For this example, select the first item this->cboFlavors->SelectedIndex = 0; } __finally { // Close the XmlTextReader if (xtr!=0) xtr->Close(); } } |
/// <summary> // When the form closes, create an XML file using the items in the combo box /// </summary> private: System::Void Form1_Closing(System::Object * sender, System::ComponentModel::CancelEventArgs * e) { XmlTextWriter *xtw = 0; String *fileName = S"ISFlavors.xml"; try { xtw = new XmlTextWriter(fileName, Encoding::UTF8); xtw->Formatting = Formatting::Indented; xtw->WriteStartDocument(); xtw->WriteStartElement(S"flavors"); for(int i = 0; i < this->cboFlavors->Items->Count; i++) { xtw->WriteElementString(S"flavor", __try_cast<String *>(this->cboFlavors->Items->Item[i])); } xtw->WriteEndElement(); xtw->WriteEndDocument(); } __finally { if (xtw!=0) xtw->Close(); } } private: System::Void btnClose_Click(System::Object * sender, System::EventArgs * e) { this->Close(); } |
|
||
Home | Copyright © 2004-2010 FunctionX, Inc. | |
|