The primary operation to be performed on a database is
to create an item. For our auto-parts business, this consists of creating an
object based on the PartDecription class. When the object has been created,
it is added to the collection class. For our application, we will use the
List<> class that is defined in the
System.Collections.Generics namespace. That class is equipped with all
the methods and properties necessary for our collection-based application.
Practical
Learning: Adding Items to an ArrayList List
|
|
- Display the New Store Item form and double-click the Submit button
- Implement the event as follows:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace CollegeParkAutoParts1
{
public partial class NewStoreItem : Form
{
List<PartDescription> lstAutoParts;
. . . No Change
private void btnSubmit_Click(object sender, EventArgs e)
{
FileStream stmAutoParts = null;
BinaryFormatter bfmAutoParts = new BinaryFormatter();
// If this directory doesn't exist, create it
Directory.CreateDirectory(@"C:\College Park Auto Parts");
// This is the file that holds the list of items
string FileName = @"C:\College Park Auto Parts\Parts.prs";
// Create a random number that will be used to identify the item
Random rnd = new Random();
txtPartNumber.Text = rnd.Next(100000, 999999).ToString();
// Make sure the user had selected a make
if (cbxYears.Text.Length == 0)
{
MessageBox.Show("You must specify the year.",
"College Park Auto-Parts",
MessageBoxButtons.OK, MessageBoxIcon.Information);
cbxYears.Focus();
return;
}
// Make sure the user had selected a make
if (cbxMakes.Text.Length == 0)
{
MessageBox.Show("You must specify the car name.",
"College Park Auto-Parts",
MessageBoxButtons.OK, MessageBoxIcon.Information);
cbxMakes.Focus();
return;
}
// Make sure the user had selected a model
if (cbxModels.Text.Length == 0)
{
MessageBox.Show("You must specify the model of the car.",
"College Park Auto-Parts",
MessageBoxButtons.OK, MessageBoxIcon.Information);
cbxModels.Focus();
return;
}
// Make sure the user had selected the part category
if (cbxCategories.Text.Length == 0)
{
MessageBox.Show("You must specify the part's category.",
"College Park Auto-Parts",
MessageBoxButtons.OK, MessageBoxIcon.Information);
cbxCategories.Focus();
return;
}
// Make sure the user had entered a name/description
if (txtPartName.Text.Length == 0)
{
MessageBox.Show("You must enter the name (or a " +
"short description) for the part.",
"College Park Auto-Parts",
MessageBoxButtons.OK, MessageBoxIcon.Information);
txtPartName.Focus();
return;
}
// Make sure the user had typed a price for the item
if (txtUnitPrice.Text.Length == 0)
{
MessageBox.Show("You must enter the price of the item.",
"College Park Auto-Parts",
MessageBoxButtons.OK, MessageBoxIcon.Information);
txtUnitPrice.Focus();
return;
}
// Before saving the new part, find out if there was
// already a file that holds the list of parts
// If that file exists, open it and store its parts
// in our lstParts variable
if (File.Exists(FileName))
{
using( stmAutoParts = new FileStream(FileName,
FileMode.Open,
FileAccess.Read,
FileShare.Read) )
{
// Retrieve the list of items from file
lstAutoParts = (List<PartDescription>)bfmAutoParts.Deserialize(stmAutoParts);
}
}
// Create the part
PartDescription part = new PartDescription();
part.PartNumber = long.Parse(txtPartNumber.Text);
part.Year = int.Parse(cbxYears.Text);
part.Make = cbxMakes.Text;
part.Model = cbxModels.Text;
part.Category = cbxCategories.Text;
part.PartName = txtPartName.Text;
part.UnitPrice = double.Parse(txtUnitPrice.Text);
// Call the Add method of our collection class to add the part
lstAutoParts.Add(part);
// Save the list
using( stmAutoParts = new FileStream(FileName,
FileMode.Create,
FileAccess.Write,
FileShare.Write) )
{
bfmAutoParts.Serialize(stmAutoParts, lstAutoParts);
// After saving the item, reset the form
cbxYears.Text = "";
cbxMakes.Text = "";
cbxModels.Text = "";
cbxCategories.Text = "";
txtPartName.Text = "";
txtUnitPrice.Text = "0.00";
txtPartNumber.Text = rnd.Next(100000, 999999).ToString();
}
}
}
}
- In the Solution Explorer, double-click CollegeParkAutoParts.cs and
double-click the Save button
- Implement its event as follows:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace CollegeParkAutoParts1
{
public partial class CollegeParkAutoParts : Form
{
int iFileName; // This variable will be used later
List<PartDescription> lstAutoParts;
public CollegeParkAutoParts()
{
InitializeComponent();
}
. . . No Change
private void btnSave_Click(object sender, EventArgs e)
{
BinaryFormatter bfmCustomerOrder = new BinaryFormatter();
// We will store our files in the following folder
string strDirectory = @"C:\College Park Auto Parts\Receipts";
DirectoryInfo dirInfo = new DirectoryInfo(strDirectory);
string strFilename = strDirectory + "\\" + txtSave.Text + ".cap";
List<PartsOrdered> lstOrderedParts = null;
if (lvwSelectedParts.Items.Count == 0)
return;
else
{
lstOrderedParts = new List<PartsOrdered>();
for (int i = 0; i < lvwSelectedParts.Items.Count; i++)
{
PartsOrdered part = new PartsOrdered();
part.PartNumber = long.Parse(lvwSelectedParts.Items[i].Text);
part.PartName = lvwSelectedParts.Items[i].SubItems[1].Text;
part.UnitPrice = double.Parse(lvwSelectedParts.Items[i].SubItems[2].Text);
part.Quantity = int.Parse(lvwSelectedParts.Items[i].SubItems[3].Text);
part.SubTotal = double.Parse(lvwSelectedParts.Items[i].SubItems[4].Text);
lstOrderedParts.Add(part);
}
using (FileStream stmCustomerOrder = new FileStream(strFilename, FileMode.Create))
{
bfmCustomerOrder.Serialize(stmCustomerOrder, lstOrderedParts);
stmCustomerOrder.Close();
}
}
}
}
}
- Save all
- Display the New Store Item form and double-click the Makes combo box
- Implement its SelectedIndexChanged event as follows:
private void cbxMakes_SelectedIndexChanged(object sender, EventArgs e)
{
cbxModels.Text = "";
cbxModels.Items.Clear();
foreach (PartDescription part in lstAutoParts)
if (part.Make == cbxMakes.Text)
if (!cbxModels.Items.Contains(part.Model))
cbxModels.Items.Add(part.Model);
}
- Display the College Park Auto-Parts form and double-click the
Add/Select button
- Implement the event as follows:
private void btnAdd_Click(object sender, EventArgs e)
{
if (txtPartNumber.Text.Length == 0)
{
MessageBox.Show("There is no part to be added to the order.",
"College Park Auto-Parts",
MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
foreach (PartDescription part in lstAutoParts)
{
if (part.PartNumber == long.Parse(txtPartNumber.Text))
{
ListViewItem lviSelectedPart =
new ListViewItem(part.PartNumber.ToString());
lviSelectedPart.SubItems.Add(part.PartName);
lviSelectedPart.SubItems.Add(part.UnitPrice.ToString());
lviSelectedPart.SubItems.Add(txtQuantity.Text);
lviSelectedPart.SubItems.Add(txtSubTotal.Text);
lvwSelectedParts.Items.Add(lviSelectedPart);
}
}
CalculateOrder();
}
- Return to the College Partk Auto-Parts form and double-click the
Open button
- Implement its event as follows:
private void btnOpen_Click(object sender, EventArgs e)
{
List<PartsOrdered> lstReceipts = null;
BinaryFormatter bfmReceipts = new BinaryFormatter();
FileStream stmReceipts = null;
string strDirectory = @"C:\College Park Auto Parts\Receipts";
string strFilename = "";
DirectoryInfo dirReceipts = new DirectoryInfo(strDirectory);
FileInfo[] fleReceipts = dirReceipts.GetFiles();
if (txtOpen.Text.Length == 0)
{
MessageBox.Show("You must enter a receipt number\n" +
"There is no receipt number to " +
"open a customer's order.",
"College Park Auto-Parts",
MessageBoxButtons.OK, MessageBoxIcon.Information);
txtOpen.Focus();
return;
}
if (fleReceipts.Length == 0)
{
MessageBox.Show("There is no customer order to open.",
"College Park Auto-Parts",
MessageBoxButtons.OK, MessageBoxIcon.Information);
txtOpen.Focus();
return;
}
else
{
lvwAutoParts.Items.Clear();
lvwSelectedParts.Items.Clear();
strFilename = strDirectory + "\\" + txtOpen.Text + ".cap";
if (File.Exists(strFilename))
{
using( stmReceipts = new FileStream(strFilename, FileMode.Open) )
{
lstReceipts = (List<PartsOrdered>)bfmReceipts.Deserialize(stmReceipts);
foreach (PartsOrdered part in lstReceipts)
{
ListViewItem lviReceiptPart =
new ListViewItem(part.PartNumber.ToString());
lviReceiptPart.SubItems.Add(part.PartName);
lviReceiptPart.SubItems.Add(part.UnitPrice.ToString());
lviReceiptPart.SubItems.Add(part.Quantity.ToString());
lviReceiptPart.SubItems.Add(part.SubTotal.ToString());
lvwSelectedParts.Items.Add(lviReceiptPart);
}
}
CalculateOrder();
txtSave.Text = txtOpen.Text;
}
else
MessageBox.Show("There is no customer order with that receipt number.",
"College Park Auto-Parts",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
- Display the New Store Item form and double-click an unoccupied area
of its body
- Implement the Load event as follows:
private void NewStoreItem_Load(object sender, EventArgs e)
{
// Since all values seem ready, prepare to process the item
lstAutoParts = new List<PartDescription>();
BinaryFormatter bfmAutoParts = new BinaryFormatter();
for (int i = DateTime.Today.Year + 1; i >= 1960; i--)
cbxYears.Items.Add(i.ToString());
// Create a random number that will be used to identify the item
Random rnd = new Random();
txtPartNumber.Text = rnd.Next(100000, 999999).ToString();
// This is the file that holds the list of parts
string FileName = @"C:\College Park Auto Parts\Parts.prs";
if (File.Exists(FileName))
{
using (FileStream stmAutoParts = new FileStream(FileName,
FileMode.Open,
FileAccess.Read,
FileShare.Read))
{
// Retrieve the list of items from file
lstAutoParts = (List<PartDescription>)bfmAutoParts.Deserialize(stmAutoParts);
// Display the car manufacturers in the Make combo box
foreach (PartDescription part in lstAutoParts )
{
if (!cbxMakes.Items.Contains(part.Make))
cbxMakes.Items.Add(part.Make);
}
// Display the pats categories in the Category combo box
foreach (PartDescription part in lstAutoParts )
{
if (!cbxCategories.Items.Contains(part.Category))
cbxCategories.Items.Add(part.Category);
}
}
}
}
- Display the College Park Auto-Parts form and click the Part # text
box
- In the Events section of the Properties window, double-click Leave
and implement the event as follows:
private void txtPartNumber_Leave(object sender, EventArgs e)
{
// We will allow the user to enter a part number
// In the beginning, we assume that the user
// had entered an invalid number
bool found = false;
// This will represent the part found, if any
PartDescription partFound = null;
// After the user had entered a part number,
// check the whole list of parts
foreach (PartDescription part in lstAutoParts)
{
// If you find a part that holds the number the user had entered
if( part.PartNumber == long.Parse(txtPartNumber.Text) )
{
// Mark that part
partFound = part;
// And update the flag that specifies that the part has been found
found = true;
}
// If the part number was not found, check the next
} // If no part has that number, the found flag keeps marked as false
// If a part with that number was found...
if (found == true)
{
// Show the corresponding part name and unit price
txtPartName.Text = partFound.PartName;
txtUnitPrice.Text = partFound.UnitPrice.ToString("F");
txtQuantity.Text = "1";
txtSubTotal.Text = partFound.UnitPrice.ToString("F");
// Give focus to the quantity in case the user was to increase it
txtQuantity.Focus();
}
else
{
// Since no part with that number was found,
// reset the text boxes
txtPartName.Text = "";
txtUnitPrice.Text = "0.00";
txtQuantity.Text = "0";
txtSubTotal.Text = "0.00";
// Let the user know that the part number that
// was entered is not in the list
MessageBox.Show("There is no part with that number.",
"College Park Auto-Parts",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
- Return to the College Park Auto-Parts form and double-click the New
Auto Part button
- Implement the event as follows:
void ShowAutoParts()
{
tvwAutoParts.Nodes.Clear();
TreeNode nodRoot = tvwAutoParts.Nodes.Add("College Park Auto-Parts",
"College Park Auto-Parts", 0, 1);
// Show the years nodes
for (int years = DateTime.Today.Year + 1; years >= 1960; years--)
nodRoot.Nodes.Add(years.ToString(), years.ToString(), 2, 3);
tvwAutoParts.SelectedNode = nodRoot;
// Expand the root node
tvwAutoParts.ExpandAll();
lstAutoParts = new List<PartDescription>();
BinaryFormatter bfmAutoParts = new BinaryFormatter();
// This is the file that holds the list of auto parts
string FileName = @"C:\College Park Auto Parts\Parts.prs";
if (File.Exists(FileName))
{
using (FileStream stmAutoParts = new FileStream(FileName,
FileMode.Open,
FileAccess.Read,
FileShare.Read))
{
// Retrieve the list of parts from file
lstAutoParts = (List<PartDescription>)bfmAutoParts.Deserialize(stmAutoParts);
// Show the makes nodes
foreach (TreeNode nodYear in nodRoot.Nodes)
{
List<string> lstMakes = new List<string>();
foreach (PartDescription part in lstAutoParts)
{
if (nodYear.Text == part.Year.ToString())
{
if (!lstMakes.Contains(part.Make))
lstMakes.Add(part.Make);
}
}
foreach (string strMake in lstMakes)
nodYear.Nodes.Add(strMake, strMake, 4, 5);
}
// Showing the models nodes
foreach (TreeNode nodYear in nodRoot.Nodes)
{
foreach (TreeNode nodMake in nodYear.Nodes)
{
List<string> lstModels = new List<string>();
foreach (PartDescription part in lstAutoParts)
{
if ((nodYear.Text == part.Year.ToString()) &&
(nodMake.Text == part.Make))
{
if (!lstModels.Contains(part.Model))
lstModels.Add(part.Model);
}
}
foreach (string strModel in lstModels)
nodMake.Nodes.Add(strModel, strModel, 6, 7);
}
}
// Showing the categories nodes
foreach (TreeNode nodYear in nodRoot.Nodes)
{
foreach (TreeNode nodMake in nodYear.Nodes)
{
foreach (TreeNode nodModel in nodMake.Nodes)
{
List<string> lstCategories = new List<string>();
foreach (PartDescription part in lstAutoParts)
{
if ((nodYear.Text == part.Year.ToString()) &&
(nodMake.Text == part.Make) &&
(nodModel.Text == part.Model))
{
if (!lstCategories.Contains(part.Category))
lstCategories.Add(part.Category);
}
}
foreach (string strCategory in lstCategories)
nodModel.Nodes.Add(strCategory,
strCategory, 8, 9);
}
}
}
}
}
}
private void btnNewAutoPart_Click(object sender, EventArgs e)
{
NewStoreItem editor = new NewStoreItem();
if (editor.ShowDialog() == DialogResult.Cancel)
ShowAutoParts();
}
- Return to the College Park Auto-Parts form and double- click the New
Customer Order button
- Implement the event as follows:
private void btnNewCustomerOrder_Click(object sender, EventArgs e)
{
// We will store our files in the following folder
string strDirectory = @"C:\College Park Auto Parts\Receipts";
DirectoryInfo dirInfo = Directory.CreateDirectory(strDirectory);
// Get the list of files, if any, from our directory
FileInfo[] fleList = dirInfo.GetFiles();
// If there is no file in the directory,
// then we will use 1000 as the first file name
if (fleList.Length == 0)
{
iFileName = 1000;
}
else // If there was at least one file in the directory
{
// Get a reference to the last file
FileInfo fleLast = fleList[fleList.Length - 1];
// Get the name of the last file without its extension
string fwe = Path.GetFileNameWithoutExtension(fleLast.FullName);
// Increment the name of the file by 1
iFileName = int.Parse(fwe) + 1;
}
txtSave.Text = iFileName.ToString();
lvwAutoParts.Items.Clear();
lvwSelectedParts.Items.Clear();
}
- Return to the College Park Auto-Parts form and double-click an
unoccupied area of its body
- Define a new method and implement the Load event as follows:
private void Central_Load(object sender, EventArgs e)
{
ShowAutoParts();
btnNewCustomerOrder_Click(sender, e);
}
- Return to the College Park Auto-Parts form and click the tree view
- In the Events section of the Properties window, double-click
NodeMouseClick
- Implement the event as follows:
private void tvwAutoParts_NodeMouseClick(object sender,
TreeNodeMouseClickEventArgs e)
{
TreeNode nodClicked = e.Node;
if (nodClicked.Level == 4)
lvwAutoParts.Items.Clear();
try
{
foreach (PartDescription part in lstAutoParts)
{
if ((part.Category == nodClicked.Text) &&
(part.Model == nodClicked.Parent.Text) &&
(part.Make == nodClicked.Parent.Parent.Text) &&
(part.Year.ToString() == nodClicked.Parent.Parent.Parent.Text))
{
ListViewItem lviAutoPart =
new ListViewItem(part.PartNumber.ToString());
lviAutoPart.SubItems.Add(part.PartName);
lviAutoPart.SubItems.Add(part.UnitPrice.ToString("F"));
lvwAutoParts.Items.Add(lviAutoPart);
}
}
}
catch (NullReferenceException)
{
}
}
- Return to the College Park Auto-Parts form and double-click the
Close button
- Implement the event as follows:
private void btnClose_Click(object sender, EventArgs e)
{
Close();
}
- Execute the application
- Click the New Auto Part button and use
the Part Editor to
create a few parts (let the computer generate the part numbers)
- Close the Part Editor
- Create a few customer part orders and save them:
- Close the forms and return to your programming environment
- Execute the application again and open a previously saved order
- Close the forms and return to your programming environment
Application
|
|