// Authors:
// Lluis Sanchez Gual (lluis@novell.com)
//
-// (C) 2004 Novell, Inc (http://www.novell.com)
+// (C) 2004-2010 Novell, Inc (http://www.novell.com)
//
//
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-#if NET_2_0
using System.Collections;
using System.ComponentModel;
+using System.Web.UI;
+using System.Web.UI.WebControls.Adapters;
namespace System.Web.UI.WebControls
{
protected virtual HierarchicalDataSourceView GetData (string viewPath)
{
- if (DataSource != null && DataSourceID != "")
- throw new HttpException ();
-
+ if (DataSource != null && !String.IsNullOrEmpty (DataSourceID))
+ throw new HttpException ();
IHierarchicalDataSource ds = GetDataSource ();
if (ds != null)
return ds.GetHierarchicalView (viewPath);
- else
- return null;
+
+ if (DataSource is IHierarchicalEnumerable)
+ return new ReadOnlyDataSourceView ((IHierarchicalEnumerable) DataSource);
+
+ return null;
}
protected virtual IHierarchicalDataSource GetDataSource ()
{
- if (DataSourceID != "")
- return NamingContainer.FindControl (DataSourceID) as IHierarchicalDataSource;
+ if (IsBoundUsingDataSourceID) {
+ Control ctrl = FindDataSource ();
+
+ if (ctrl == null)
+ throw new HttpException (string.Format ("A control with ID '{0}' could not be found.", DataSourceID));
+ if (!(ctrl is IHierarchicalDataSource))
+ throw new HttpException (string.Format ("The control with ID '{0}' is not a control of type IHierarchicalDataSource.", DataSourceID));
+ return (IHierarchicalDataSource) ctrl;
+ }
return DataSource as IHierarchicalDataSource;
}
- [MonoTODO ("Not implemented")]
+ bool IsDataBound {
+ get { return ViewState.GetBool ("DataBound", false); }
+ set { ViewState ["DataBound"] = value; }
+ }
+
protected void MarkAsDataBound ()
{
- throw new NotImplementedException ();
+ IsDataBound = true;
}
protected override void OnDataPropertyChanged ()
protected internal override void OnLoad (EventArgs e)
{
- if (IsBoundUsingDataSourceID && (!Page.IsPostBack || !EnableViewState))
+ if (!Initialized) {
+ Initialize ();
+ ConfirmInitState ();
+ }
+
+ base.OnLoad(e);
+ }
+
+ void Initialize ()
+ {
+ if (!Page.IsPostBack || (IsViewStateEnabled && !IsDataBound))
RequiresDataBinding = true;
-
+
IHierarchicalDataSource ds = GetDataSource ();
if (ds != null && DataSourceID != "")
ds.DataSourceChanged += new EventHandler (OnDataSourceChanged);
-
- base.OnLoad(e);
}
protected override void OnPagePreLoad (object sender, EventArgs e)
{
base.OnPagePreLoad (sender, e);
+
+ Initialize ();
+ }
+
+ protected void InternalPerformDataBinding ()
+ {
+ HierarchicalDataBoundControlAdapter adapter
+ = Adapter as HierarchicalDataBoundControlAdapter;
+ if (adapter != null)
+ adapter.PerformDataBinding ();
+ else
+ PerformDataBinding ();
}
protected internal virtual void PerformDataBinding ()
protected override void PerformSelect ()
{
OnDataBinding (EventArgs.Empty);
- PerformDataBinding ();
+ InternalPerformDataBinding ();
+ // The PerformDataBinding method has completed.
+ RequiresDataBinding = false;
+ MarkAsDataBound ();
OnDataBound (EventArgs.Empty);
}
protected override void ValidateDataSource (object dataSource)
{
- if (dataSource is IHierarchicalDataSource || dataSource is IHierarchicalEnumerable)
+ if (dataSource == null || dataSource is IHierarchicalDataSource || dataSource is IHierarchicalEnumerable)
return;
throw new InvalidOperationException ("Invalid data source");
}
}
}
-#endif
+
+