5 // Atsushi Enomoto <atsushi@ximian.com>
7 // Copyright (C) 2008 Novell, Inc http://novell.com
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System.Collections;
33 using System.ComponentModel;
34 using System.Security.Permissions;
36 using System.Web.DynamicData;
39 namespace System.Web.UI.WebControls
41 // [ToolboxBitmap (typeof (LinqDataSource), "LinqDataSource.ico")]
42 [PersistChildren (false)]
43 [ParseChildren (true)]
44 [Designer ("System.Web.UI.Design.WebControls.LinqDataSourceDesigner, System.Web.Extensions.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")]
45 [DefaultEvent ("Selecting")]
46 [ToolboxItemFilter ("System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", ToolboxItemFilterType.Require)]
47 [DefaultProperty ("ContextTypeName")]
48 public class LinqDataSource : DataSourceControl, IDynamicDataSource
50 static readonly string [] empty_names = new string [] { "DefaultView" };
52 public LinqDataSource ()
56 protected internal override void OnInit (EventArgs e)
58 Page.LoadComplete += OnPageLoadComplete;
61 void OnPageLoadComplete (object sender, EventArgs e)
63 SelectParameters.UpdateValues (Context, this);
64 WhereParameters.UpdateValues (Context, this);
65 GroupByParameters.UpdateValues (Context, this);
66 OrderByParameters.UpdateValues (Context, this);
67 OrderGroupsByParameters.UpdateValues (Context, this);
70 protected internal override void OnUnload (EventArgs e)
74 // no further things to do?
79 LinqDataSourceView view;
80 LinqDataSourceView View {
84 if (IsTrackingViewState)
85 ((IStateManager) view).TrackViewState ();
91 protected virtual LinqDataSourceView CreateView ()
93 var view = new LinqDataSourceView (this, Guid.NewGuid ().ToString (), HttpContext.Current);
94 if (IsTrackingViewState)
95 ((IStateManager) view).TrackViewState ();
99 protected override DataSourceView GetView (string viewName)
101 if (String.IsNullOrEmpty (viewName) || (String.Compare (viewName, empty_names [0], StringComparison.InvariantCultureIgnoreCase) == 0))
103 throw new ArgumentException ("viewName must be 'DefaultView' in LinqDataSource");
106 protected override ICollection GetViewNames ()
113 [Category ("Behavior")]
114 [DefaultValue (false)]
115 public bool AutoGenerateOrderByClause {
116 get { return View.AutoGenerateOrderByClause; }
117 set { View.AutoGenerateOrderByClause = value; }
120 [Category ("Behavior")]
121 [DefaultValue (false)]
122 public bool AutoGenerateWhereClause {
123 get { return View.AutoGenerateWhereClause; }
124 set { View.AutoGenerateWhereClause = value; }
127 [Category ("Behavior")]
128 [DefaultValue (true)]
129 public bool AutoPage {
130 get { return View.AutoPage; }
131 set { View.AutoPage = value; }
134 [Category ("Behavior")]
135 [DefaultValue (true)]
136 public bool AutoSort {
137 get { return View.AutoSort; }
138 set { View.AutoSort = value; }
143 public string ContextTypeName { get; set; }
147 [MonoTODO ("looks like we need System.Web.Query.Dynamic stuff or alternative")]
148 Type IDynamicDataSource.ContextType {
150 if (context_type != null && context_type.FullName == ContextTypeName)
153 if (String.IsNullOrEmpty (ContextTypeName))
156 // FIXME: retrieve type from BuildProvider or whatever.
157 context_type = LoadType (ContextTypeName);
158 if (context_type == null)
159 throw new ArgumentException (String.Format ("Type '{0}' cannot be loaded", ContextTypeName));
164 throw new ArgumentNullException ("value");
165 context_type = value;
166 ContextTypeName = context_type.FullName;
170 private Type LoadType (string name)
172 foreach (var ass in AppDomain.CurrentDomain.GetAssemblies ())
173 foreach (var type in ass.GetTypes ())
174 if (type.FullName == name)
179 string IDynamicDataSource.EntitySetName {
180 get { return TableName; }
181 set { TableName = value; }
186 public string TableName {
187 get { return View.TableName; }
188 set { View.TableName = value; }
191 [Category ("Behavior")]
192 [DefaultValue (false)]
193 public bool EnableDelete {
194 get { return View.EnableDelete; }
195 set { View.EnableDelete = value; }
198 [Category ("Behavior")]
199 [DefaultValue (false)]
200 public bool EnableInsert {
201 get { return View.EnableInsert; }
202 set { View.EnableInsert = value; }
205 [Category ("Behavior")]
206 [DefaultValue (false)]
207 public bool EnableObjectTracking {
208 get { return View.EnableObjectTracking; }
209 set { View.EnableObjectTracking = value; }
212 [Category ("Behavior")]
213 [DefaultValue (false)]
214 public bool EnableUpdate {
215 get { return View.EnableUpdate; }
216 set { View.EnableUpdate = value; }
221 public string GroupBy {
222 get { return View.GroupBy; }
223 set { View.GroupBy = value; }
228 public string OrderBy {
229 get { return View.OrderBy; }
230 set { View.OrderBy = value; }
235 public string OrderGroupsBy {
236 get { return View.OrderGroupsBy; }
237 set { View.OrderGroupsBy = value; }
242 public string Select {
243 get { return View.SelectNew; }
244 set { View.SelectNew = value; }
249 public string Where {
250 get { return View.Where; }
251 set { View.Where = value; }
254 [MergableProperty (false)]
256 [DefaultValue (null)]
257 [PersistenceMode (PersistenceMode.InnerProperty)]
259 public ParameterCollection SelectParameters {
260 get { return View.SelectNewParameters; }
263 [MergableProperty (false)]
265 [DefaultValue (null)]
267 [PersistenceMode (PersistenceMode.InnerProperty)]
268 public ParameterCollection WhereParameters {
269 get { return View.WhereParameters; }
272 [MergableProperty (false)]
274 [DefaultValue (null)]
276 [PersistenceMode (PersistenceMode.InnerProperty)]
277 public ParameterCollection GroupByParameters {
278 get { return View.GroupByParameters; }
281 [MergableProperty (false)]
283 [DefaultValue (null)]
285 [PersistenceMode (PersistenceMode.InnerProperty)]
286 public ParameterCollection OrderByParameters {
287 get { return View.OrderByParameters; }
290 [MergableProperty (false)]
292 [DefaultValue (null)]
293 [PersistenceMode (PersistenceMode.InnerProperty)]
295 public ParameterCollection OrderGroupsByParameters {
296 get { return View.OrderGroupsByParameters; }
299 [MergableProperty (false)]
301 [DefaultValue (null)]
302 [PersistenceMode (PersistenceMode.InnerProperty)]
304 public ParameterCollection DeleteParameters {
305 get { return View.DeleteParameters; }
308 [MergableProperty (false)]
310 [DefaultValue (null)]
311 [PersistenceMode (PersistenceMode.InnerProperty)]
313 public ParameterCollection InsertParameters {
314 get { return View.InsertParameters; }
317 [MergableProperty (false)]
319 [DefaultValue (null)]
320 [PersistenceMode (PersistenceMode.InnerProperty)]
322 public ParameterCollection UpdateParameters {
323 get { return View.UpdateParameters; }
326 public int Delete (IDictionary keys, IDictionary oldValues)
328 return View.Delete (keys, oldValues);
331 public int Insert (IDictionary values)
333 return View.Insert (values);
336 public int Update (IDictionary keys, IDictionary values, IDictionary oldValues)
338 return View.Update (keys, values, oldValues);
343 [Category ("Behavior")]
344 [DefaultValue (true)]
345 public bool StoreOriginalValuesInViewState {
346 get { return View.StoreOriginalValuesInViewState; }
347 set { View.StoreOriginalValuesInViewState = value; }
350 protected override void LoadViewState (object savedState)
352 Pair p = savedState as Pair;
354 base.LoadViewState (p.First);
355 ((IStateManager) View).LoadViewState (p.Second);
359 protected override object SaveViewState ()
361 object me = base.SaveViewState (), view = ((IStateManager) View).SaveViewState ();
362 if (me != null || view != null)
363 return new Pair (me, view);
368 protected override void TrackViewState ()
370 base.TrackViewState ();
372 ((IStateManager) view).TrackViewState ();
377 #region Events (Dispatching)
379 public event EventHandler<LinqDataSourceStatusEventArgs> ContextCreated {
380 add { View.ContextCreated += value; }
381 remove { View.ContextCreated -= value; }
384 public event EventHandler<LinqDataSourceContextEventArgs> ContextCreating {
385 add { View.ContextCreating += value; }
386 remove { View.ContextCreating -= value; }
389 public event EventHandler<LinqDataSourceDisposeEventArgs> ContextDisposing {
390 add { View.ContextDisposing += value; }
391 remove { View.ContextDisposing -= value; }
394 public event EventHandler<LinqDataSourceStatusEventArgs> Deleted {
395 add { View.Deleted += value; }
396 remove { View.Deleted -= value; }
399 public event EventHandler<LinqDataSourceDeleteEventArgs> Deleting {
400 add { View.Deleting += value; }
401 remove { View.Deleting -= value; }
404 event EventHandler<DynamicValidatorEventArgs> IDynamicDataSource.Exception {
405 add { View.Exception += value; }
406 remove { View.Exception -= value; }
409 public event EventHandler<LinqDataSourceStatusEventArgs> Inserted {
410 add { View.Inserted += value; }
411 remove { View.Inserted -= value; }
414 public event EventHandler<LinqDataSourceInsertEventArgs> Inserting {
415 add { View.Inserting += value; }
416 remove { View.Inserting -= value; }
419 public event EventHandler<LinqDataSourceStatusEventArgs> Selected {
420 add { View.Selected += value; }
421 remove { View.Selected -= value; }
424 public event EventHandler<LinqDataSourceSelectEventArgs> Selecting {
425 add { View.Selecting += value; }
426 remove { View.Selecting -= value; }
429 public event EventHandler<LinqDataSourceStatusEventArgs> Updated {
430 add { View.Updated += value; }
431 remove { View.Updated -= value; }
434 public event EventHandler<LinqDataSourceUpdateEventArgs> Updating {
435 add { View.Updating += value; }
436 remove { View.Updating -= value; }