This show how I use Petapoco to complete form which uses to create new payment and edit exist payment
namespace Sales
{
public partial class PaymentForm : Form
{
petaConnectionDB db = new petaConnectionDB();
paymentheader _ph = new paymentheader();
private string _paymentNo;
private bool _view;
public PaymentForm()
{
InitializeComponent();
_view = false;
}
public PaymentForm(string paymentNo)
{
InitializeComponent();
_paymentNo = paymentNo;
_view = true;
}
private void PaymentForm_Load(object sender, EventArgs e)
{
saleIDComboBox.DataSource = db.Query<sale>("SELECT * FROM sale").ToList();
db.BeginTransaction();
if (!_view)
{
AutoPaymentNo();
AddDefaultRows();
btPrint.Visible = false;
}
else
{
_ph = db.SingleOrDefault<paymentheader>("SELECT * FROM paymentheader WHERE PaymentNO = @0", _paymentNo); // << First time I have var in front of the line but should remove
paymentheaderBindingSource.DataSource = _ph;
saleIDComboBox.SelectedValue = _ph.SaleID;
paymentitemBindingSource.DataSource = db.Query<paymentitem>("SELECT * FROM paymentitem WHERE PaymentNO = @0", _paymentNo);
paymentDateDateTimePicker.Enabled = false;
}
}
private void AutoPaymentNo()
{
var date = paymentDateDateTimePicker.Value.ToString("yyyyMMdd");
var countInDb = db.ExecuteScalar<long>("SELECT COUNT(PaymentNO) FROM paymentheader WHERE PaymentNO LIKE @0", "%" + date + "%");
var number = countInDb.ToString().PadLeft(4, '0');
var paymentNo = date + number;
paymentNOTextBox.Text = paymentNo;
}
private void AddDefaultRows()
{
//Initialize Header
_ph = new paymentheader
{
PaymentDate = paymentDateDateTimePicker.Value,
SaleID = int.Parse(saleIDComboBox.SelectedValue.ToString()),
CR_DATE = DateTime.Now,
LT_DATE = DateTime.Now
};
db.Save(_ph);
var newItem = new paymentitem()
{
PaymentTypeID = 1,
PaymentDetail = "ค่าน้ำมัน",
LT_DATE = DateTime.Now,
CR_DATE = DateTime.Now,
};
paymentitemBindingSource.Add(newItem);
db.Save(newItem);
newItem = new paymentitem()
{
PaymentTypeID = 2,
PaymentDetail = "ค่าทางด่วน",
LT_DATE = DateTime.Now,
CR_DATE = DateTime.Now,
};
paymentitemBindingSource.Add(newItem);
db.Save(newItem);
newItem = new paymentitem()
{
PaymentTypeID = 3,
PaymentDetail = "ค่าโทรศัพท์",
LT_DATE = DateTime.Now,
CR_DATE = DateTime.Now,
};
paymentitemBindingSource.Add(newItem);
db.Save(newItem);
newItem = new paymentitem()
{
PaymentTypeID = 4,
PaymentDetail = "ค่าเลี้ยงรับรอง",
LT_DATE = DateTime.Now,
CR_DATE = DateTime.Now,
};
paymentitemBindingSource.Add(newItem);
db.Save(newItem);
}
private void paymentitemDataGridView_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
{
if (e.Row.Index < 4)
{
e.Cancel = true;
return;
}
var rowIndex = e.Row.Index; // We use Gridview row index instead because BindingSource.Current isn't work when user drag then deleting multiple row
db.Delete(paymentitemDataGridView.Rows[rowIndex].DataBoundItem as paymentitem);
}
private void btAdd_Click(object sender, EventArgs e)
{
AddNewRow();
}
private void AddNewRow()
{
var newItem = new paymentitem()
{
PaymentTypeID = 5,
LT_DATE = DateTime.Now,
CR_DATE = DateTime.Now
};
paymentitemBindingSource.Add(newItem);
db.Save(newItem);
}
private void btSave_Click(object sender, EventArgs e)
{
Save();
}
private void paymentDateDateTimePicker_ValueChanged(object sender, EventArgs e)
{
AutoPaymentNo();
}
private void Save()
{
paymentitemDataGridView.EndEdit();
_ph.PaymentNO = paymentNOTextBox.Text;
_ph.PaymentDate = paymentDateDateTimePicker.Value;
_ph.SaleID = int.Parse(saleIDComboBox.SelectedValue.ToString());
db.Update(_ph);
foreach (DataGridViewRow row in paymentitemDataGridView.Rows)
{
row.Cells[PaymentNO.DisplayIndex].Value = paymentNOTextBox.Text;
var query = db.SingleOrDefault<paymentitem>("WHERE PaymentItemID = @0",
row.Cells[PaymentItemID.DisplayIndex].Value);
query.PaymentNO = paymentNOTextBox.Text;
db.Save(query);
}
db.CompleteTransaction();
MessageBox.Show("Complete");
paymentNOTextBox.Enabled = false;
paymentDateDateTimePicker.Enabled = false;
btPrint.Visible = true;
}
private void paymentitemDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
try
{
db.Save((paymentitem)paymentitemBindingSource.Current);
}
catch (Exception)
{
return;
}
}
private void PaymentForm_FormClosing(object sender, FormClosingEventArgs e)
{
db.AbortTransaction();
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
switch (keyData)
{
case (Keys.Enter):
var text = this.ActiveControl.Name;
var itemVFName = paymentitemDataGridView.Name;
var editMode = paymentitemDataGridView.IsCurrentCellInEditMode;
if (text == itemVFName || editMode)
{
if (GridviewDecoration.CheckAllEmptyCellExist(paymentitemDataGridView))
GridviewDecoration.GoNextEmptyCell(ref paymentitemDataGridView);
else
{
if (GridviewDecoration.IsFocusingLastRowColumn(paymentitemDataGridView) && !editMode)
AddNewRow();
GridviewDecoration.GoNextCell(ref paymentitemDataGridView);
}
}
return true;
case (Keys.Escape):
this.Close();
return true;
case (Keys.Control | Keys.S):
Save();
return true;
case (Keys.Control | Keys.P):
Print();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
private void btPrint_Click(object sender, EventArgs e)
{
Print();
}
private void Print()
{
var printPayment = new PrintPayment(paymentNOTextBox.Text);
printPayment.Show();
}
}
}