Gustav Brock
Gustav at cactus.dk
Mon Jan 25 13:38:38 CST 2010
Hi John
I lost you too somewhere down the line ...
However, here's an example where a manual update at one form (Main) raises an event which requeries another form (Employees). Perhaps that can guide you a little. It writes to the console too but for debugging only. Some code has been snipped. Note the custom attributes.
<FormMain.cs>
using System;
using System.IO;
using System.Windows.Forms;
namespace DLMail
{
public partial class FormMain : Form
{
public DataSetDL DlDataSet = new DataSetDL();
public FormEmployer EmployerForm;
public FormEmployee EmployeeForm;
public FormPaySlip PaySlipForm;
public FormSystem SystemForm;
private string _dropFolder = @"Drop";
private string _dropPath;
private string _execPath;
private string _dataPath;
private string _dataFileName = @"DLMail.xml";
private string _dataBaseFile;
private int _employerId = -1;
private string _employerName = String.Empty;
private string _pdfPassword = String.Empty;
public string ExecPath
{
get { return _execPath; }
}
public string DataPath
{
get { return _dataPath; }
}
public string DataBaseFile
{
get { return _dataBaseFile; }
}
/// <summary>
/// The path to the folder where to copy new pay slip PDF files.
/// </summary>
public string DropPath
{
get { return _dropPath; }
}
public int EmployerId
{
get { return _employerId; }
}
public string EmployerName
{
get { return _employerName; }
}
public string PdfPassword
{
get { return _pdfPassword; }
}
// Delegate declaration.
public delegate void ChangingHandler(object sender, EmployerArgs employerArgs);
// Event declaration.
public event ChangingHandler EmployerChanged;
public void ChangeEmployer()
{
// Call the event.
EmployerArgs employerArgs = new EmployerArgs(_employerId, _employerName, _pdfPassword, _dataPath);
// Running on Windows Vista, first time run of EmployerChanged
// raises a null reference error.
try
{
EmployerChanged(this, employerArgs);
}
catch (Exception exception)
{
Console.WriteLine(exception.Source);
}
}
public FormMain()
{
InitializeComponent();
InitializeDataSet();
InitializeFolders();
}
private void FormMain_Load(object sender, EventArgs e)
{
FillEmployerComboBox();
this.EmployerChanged += new ChangingHandler(FormMain_EmployerChanged);
}
private void InitializeDataSet()
{
_execPath = Path.GetDirectoryName(Application.ExecutablePath);
_dataBaseFile = Path.Combine(_execPath, _dataFileName);
if (!File.Exists(_dataBaseFile))
{
//snip
}
else
{
DlDataSet.ReadXml(_dataBaseFile);
DataSetDL .DataTablePaySlipTypeDataTable paySlipTypeDataTable = DlDataSet .DataTablePaySlipType ;
}
}
private void InitializeFolders()
{
string dropPath = Path.Combine(_execPath, _dropFolder);
//snip
_dropPath = dropPath;
}
private void FillEmployerComboBox()
{
int selectedIndex = -1;
if (EmployerComboBox.SelectedIndex > -1)
{
selectedIndex = EmployerComboBox.SelectedIndex;
}
DataSetDL.DataTableEmployerDataTable dataTableEmployer = DlDataSet.DataTableEmployer;
EmployerComboBox.SelectedItem = "Id";
EmployerComboBox.DisplayMember = "Organisation";
EmployerComboBox.DataSource = dataTableEmployer;
if (selectedIndex != -1)
{
EmployerComboBox.SelectedIndex = selectedIndex;
}
}
private void EmployerComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox comboBox = (ComboBox)sender;
if (comboBox.SelectedItem != null)
{
int employerId = Convert.ToInt32(comboBox.SelectedValue);
if (!employerId.Equals(_employerId))
{
_employerId = employerId;
_employerName = comboBox.Text;
SetDataPath();
// Raise event.
this.ChangeEmployer();
}
}
}
void FormMain_EmployerChanged(object sender, EmployerArgs employerArgs)
{
Console.WriteLine("Change: " + employerArgs.EmployerId().ToString());
}
private void SetDataPath()
{
DataSetDL.DataTableEmployerRow employerRow = DlDataSet.DataTableEmployer.FindById(_employerId);
if (employerRow.IsPdfPasswordNull())
{
_pdfPassword = string.Empty;
}
else
{
_pdfPassword = employerRow.PdfPassword.Trim();
}
_dataPath = Path.Combine(_execPath, employerRow.DataPath);
}
private void EmployeeButton_Click(object sender, EventArgs e)
{
if (EmployeeForm == null)
{
EmployeeForm = new FormEmployee();
EmployeeForm.Show();
EmployeeForm.FormClosed += new FormClosedEventHandler(EmployeeForm_FormClosed);
}
else
{
EmployeeForm.Focus();
}
}
private void EmployeeForm_FormClosed(object sender, FormClosedEventArgs e)
{
EmployeeForm = null;
SaveData();
}
private void SaveData()
{
this.DlDataSet.WriteXml(_dataBaseFile);
}
}
// Custom attributes.
public class EmployerArgs : System.EventArgs
{
private int employerId = 0;
private string employerName = String.Empty;
private string pdfPassword = String.Empty;
private string dataPath = String.Empty;
public EmployerArgs(int id, string name, string password, string path)
{
this.employerId = id;
this.employerName = name;
this.pdfPassword = password;
this.dataPath = path;
}
public int EmployerId()
{
return employerId;
}
public string EmployerName()
{
return employerName;
}
public string PdfPassword()
{
return pdfPassword;
}
public string DataPath()
{
return dataPath;
}
}
}
</FormMain.cs>
<FormEmployee.cs>
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;
namespace DLMail
{
public partial class FormEmployee : Form
{
private string _dataBaseFile;
private int _employerId;
public FormEmployee()
{
InitializeComponent();
InitializeDataSet();
}
private void InitializeDataSet()
{
FormMain formMain = (FormMain)Application.OpenForms[0];
_dataBaseFile = formMain.DataBaseFile;
_employerId = formMain.EmployerId;
this.dataSetDL = formMain.DlDataSet;
ChangeEmployer();
formMain.EmployerChanged += new FormMain.ChangingHandler(formMain_EmployerChanged);
}
void formMain_EmployerChanged(object sender, EmployerArgs formArgs)
{
_employerId = formArgs.EmployerId();
ChangeEmployer();
}
private void ChangeEmployer()
{
string filter = String.Empty;
// Select only employees of the selected employer.
filter = "EmployerId = " + _employerId.ToString();
this.dataTableEmployeeBindingSource.Filter = filter;
this.dataTableEmployeeBindingSource.DataSource = this.dataSetDL;
}
}
}
</FormEmployee.cs>
/gustav
>>> jwcolby at colbyconsulting.com 25-01-2010 17:50:02 >>>
Silly me, I thought that events would be easy in C#. I guess once you figure them out they probably
are, but coming from VBA where all the behind the scenes stuff is done for you, it is kinda confusing.
What I want to do is execute stored procedures, and publish status information about each SP
executed on my form starts a process running.