using System;
using System.Collections.Generic;
using System.Text;
using Ubik.Engine.Client;
using System.ComponentModel;
using System.Windows.Forms;
namespace StoresAndStockPricing.Controls{
public class BoundDataGridView : DataGridView
{
private IBoundDataGridViewSource _bindingSource;
private Transaction _transaction;
private bool _valueChanged = false;
private bool _columnsLoaded = false;
private ListChangedEventHandler _listChangedHander;
public BoundDataGridView()
{
_listChangedHander = new ListChangedEventHandler(BoundDataGridView_ListChanged);
InitializeComponent();
}
/// <summary>
/// MUST use this rather than DataSource... I need to work out more about rebinding columns otherwise.
/// </summary>
public IBoundDataGridViewSource BindingSource
{
get
{
return _bindingSource;
}
set
{
if (_bindingSource != null)
{
((System.ComponentModel.IBindingList)_bindingSource).ListChanged -= _listChangedHander;
}
_bindingSource = value;
if (_bindingSource != null)
{
((IBindingList)_bindingSource).ListChanged += _listChangedHander;
}
DataSource = (IBindingList)_bindingSource;
}
}
void BoundDataGridView_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)
{
if (!_columnsLoaded)
{
// Have to force the view to re-bind, not sure why...
// There is probably a better way to do this.
DataSource = null;
DataSource = (IBindingList)_bindingSource;
_columnsLoaded = Columns.Count > 0;
}
}
private void InitializeComponent()
{
((System.ComponentModel.ISupportInitialize)(this)).BeginInit();
this.SuspendLayout();
//
// BoundDataGridView
//
this.CellBeginEdit += new System.Windows.Forms.DataGridViewCellCancelEventHandler(this.BoundDataGridView_OnCellBeginEdit);
this.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.BoundDataGridView_OnCellEndEdit);
this.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.BoundDataGridView_OnCellValueChanged);
this.DataError += new DataGridViewDataErrorEventHandler(BoundDataGridView_DataError);
((System.ComponentModel.ISupportInitialize)(this)).EndInit();
this.ResumeLayout(false);
}
private void BoundDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
EndTransaction(false);
e.ThrowException = true;
}
private void BoundDataGridView_OnCellBeginEdit(object sender, System.Windows.Forms.DataGridViewCellCancelEventArgs e)
{
if (_transaction == null && _bindingSource != null)
_transaction = _bindingSource.Session.BeginTransaction();
}
private void BoundDataGridView_OnCellValueChanged(object sender, System.Windows.Forms.DataGridViewCellEventArgs e)
{
_valueChanged = true;
}
private void BoundDataGridView_OnCellEndEdit(object sender, System.Windows.Forms.DataGridViewCellEventArgs e)
{
EndTransaction(true);
}
private void EndTransaction(bool commit)
{
if (_transaction == null)
throw new InvalidOperationException();
if (!_valueChanged || !commit)
{
Transaction aborted = _transaction;
_transaction = null;
aborted.Abort();
}
else
{
_transaction.Commit();
_transaction = null;
_valueChanged = false;
}
}
public T GetSelectedItem<T>() where T : Individual
{
if (SelectedRows.Count == 1)
return ((BoundDataGridViewRow<T>)SelectedRows[0].DataBoundItem).Value;
else
throw new InvalidOperationException(BoundDataGridViewResources.MultipleItemsSelected);
}
public IEnumerable<T> GetSelectedItems<T>() where T : Individual
{
foreach (DataGridViewRow row in SelectedRows)
{
yield return ((BoundDataGridViewRow<T>)row.DataBoundItem).Value;
}
}
public void SelectItem<T>(T item) where T : Individual
{
ClearSelection();
foreach (DataGridViewRow row in Rows)
{
if (((BoundDataGridViewRow<T>)row.DataBoundItem).Value == item)
{
row.Selected = true;
return;
}
}
}
}
}
|