using System;
using System.Collections;
using System.Web.UI;
namespace Csla.Web
{
///
/// The object responsible for managing data binding
/// to a specific CSLA .NET object.
///
public class CslaDataSourceView : DataSourceView
{
private CslaDataSource _owner;
private string _typeAssemblyName;
private string _typeName;
private bool _typeSupportsPaging;
private bool _typeSupportsSorting;
///
/// Creates an instance of the object.
///
/// The CslaDataSource object
/// that owns this view.
/// The name of the view.
public CslaDataSourceView(CslaDataSource owner, string viewName)
: base(owner, viewName)
{
_owner = owner;
}
///
/// Get or set the name of the assembly (no longer used).
///
/// Obsolete - do not use.
public string TypeAssemblyName
{
get { return _typeAssemblyName; }
set { _typeAssemblyName = value; }
}
///
/// Get or set the full type name of the business object
/// class to be used as a data source.
///
/// Full type name of the business class.
public string TypeName
{
get { return _typeName; }
set { _typeName = value; }
}
///
/// Get or set a value indicating whether the
/// business object data source supports paging.
///
///
/// To support paging, the business object
/// (collection) must implement
/// .
///
public bool TypeSupportsPaging
{
get { return _typeSupportsPaging; }
set { _typeSupportsPaging = value; }
}
///
/// Get or set a value indicating whether the
/// business object data source supports sorting.
///
public bool TypeSupportsSorting
{
get { return _typeSupportsSorting; }
set { _typeSupportsSorting = value; }
}
#region Select
///
/// Implements the select behavior for
/// the control by raising the
/// event.
///
/// Arguments object.
/// The data returned from the select.
protected override System.Collections.IEnumerable
ExecuteSelect(DataSourceSelectArguments arguments)
{
// get the object from the page
SelectObjectArgs args = new SelectObjectArgs(arguments);
_owner.OnSelectObject(args);
object result = args.BusinessObject;
if (arguments.RetrieveTotalRowCount)
{
int rowCount;
if (result == null)
rowCount = 0;
else if (result is Csla.Core.IReportTotalRowCount)
rowCount = ((Csla.Core.IReportTotalRowCount)result).TotalRowCount;
else if (result is IList)
rowCount = ((IList)result).Count;
else if (result is IEnumerable)
{
IEnumerable temp = (IEnumerable)result;
int count = 0;
foreach (object item in temp)
count++;
rowCount = count;
}
else
rowCount = 1;
arguments.TotalRowCount = rowCount;
}
// if the result isn't IEnumerable then
// wrap it in a collection
if (!(result is IEnumerable))
{
ArrayList list = new ArrayList();
if (result != null)
list.Add(result);
result = list;
}
// now return the object as a result
return (IEnumerable)result;
}
#endregion
#region Insert
///
/// Gets a value indicating whether the data source can
/// insert data.
///
public override bool CanInsert
{
get
{
if (typeof(Csla.Core.IUndoableObject).IsAssignableFrom(
CslaDataSource.GetType(_typeAssemblyName, _typeName)))
return true;
else
return false;
}
}
///
/// Implements the insert behavior for
/// the control by raising the
/// event.
///
/// The values from
/// the UI that are to be inserted.
/// The number of rows affected.
protected override int ExecuteInsert(
IDictionary values)
{
// tell the page to insert the object
InsertObjectArgs args =
new InsertObjectArgs(values);
_owner.OnInsertObject(args);
return args.RowsAffected;
}
#endregion
#region Delete
///
/// Gets a value indicating whether the data source can
/// delete data.
///
public override bool CanDelete
{
get
{
if (typeof(Csla.Core.IUndoableObject).IsAssignableFrom(
CslaDataSource.GetType(_typeAssemblyName, _typeName)))
return true;
else
return false;
}
}
///
/// Implements the delete behavior for
/// the control by raising the
/// event.
///
/// The key values from
/// the UI that are to be deleted.
/// The old values
/// from the UI.
/// The number of rows affected.
protected override int ExecuteDelete(IDictionary keys, IDictionary oldValues)
{
// tell the page to delete the object
DeleteObjectArgs args = new DeleteObjectArgs(keys, oldValues);
_owner.OnDeleteObject(args);
return args.RowsAffected;
}
#endregion
#region Update
///
/// Gets a value indicating whether the data source can
/// update data.
///
public override bool CanUpdate
{
get
{
if (typeof(Csla.Core.IUndoableObject).IsAssignableFrom(
CslaDataSource.GetType(_typeAssemblyName, _typeName)))
return true;
else
return false;
}
}
///
/// Implements the update behavior for
/// the control by raising the
/// event.
///
/// The key values from the UI
/// that identify the object to be updated.
/// The values from
/// the UI that are to be inserted.
/// The old values
/// from the UI.
/// The number of rows affected.
protected override int ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues)
{
// tell the page to update the object
UpdateObjectArgs args = new UpdateObjectArgs(keys, values, oldValues);
_owner.OnUpdateObject(args);
return args.RowsAffected;
}
#endregion
#region Other Operations
///
/// Gets a value indicating whether the data source supports
/// paging of the data.
///
public override bool CanPage
{
get
{
return _typeSupportsPaging;
}
}
///
/// Gets a value indicating whether the data source can
/// retrieve the total number of rows of data. Always
/// returns .
///
public override bool CanRetrieveTotalRowCount
{
get { return true; }
}
///
/// Gets a alue indicating whether the data source supports
/// sorting of the data. Always returns .
///
public override bool CanSort
{
get
{
return _typeSupportsSorting;
}
}
#endregion
}
}