/Xpand/Xpand.ExpressApp/Xpand.ExpressApp.Web/ListEditors/XpandASPxGridListEditor.cs

https://bitbucket.org/expand/expand · C# · 186 lines · 152 code · 34 blank · 0 comment · 35 complexity · 2f1f301fa0cff01a883d73c9c7e81e97 MD5 · raw file

  1. using System;
  2. using System.Collections;
  3. using DevExpress.ExpressApp;
  4. using DevExpress.ExpressApp.Editors;
  5. using DevExpress.ExpressApp.Model;
  6. using DevExpress.ExpressApp.Web.Editors.ASPx;
  7. using DevExpress.Web.ASPxClasses;
  8. using DevExpress.Web.ASPxGridView;
  9. using System.Globalization;
  10. using System.Collections.Generic;
  11. using DevExpress.ExpressApp.Web.Editors;
  12. using Xpand.ExpressApp.ListEditors;
  13. using Xpand.ExpressApp.Web.Layout;
  14. namespace Xpand.ExpressApp.Web.ListEditors {
  15. class MasterDetailProvider {
  16. ASPxGridView _gridView;
  17. bool _inGetFocusedObject;
  18. public SelectionType SelectionType {
  19. get { return SelectionType.FocusedObject | SelectionType.MultipleSelection; }
  20. }
  21. public object GetFocusedObject(CollectionSourceBase collectionSource) {
  22. if (_inGetFocusedObject || _gridView == null)
  23. return null;
  24. try {
  25. _inGetFocusedObject = true;
  26. if (_gridView.FocusedRowIndex == -1)
  27. return null;
  28. return _gridView.GetRow(_gridView.FocusedRowIndex);
  29. } finally {
  30. _inGetFocusedObject = false;
  31. }
  32. }
  33. public void SetupGridView(ASPxGridView gridView, Action onFocusedObjectChanged) {
  34. _gridView = gridView;
  35. gridView.SettingsBehavior.AllowFocusedRow = true;
  36. gridView.Load += (s, e) => onFocusedObjectChanged();
  37. gridView.ClientSideEvents.Init = "function (s,e) { s.firstRowChangedAfterInit = true;}";
  38. gridView.ClientSideEvents.FocusedRowChanged = string.Format(
  39. @"function(s,e) {{
  40. {0}
  41. var parentSplitter = XpandHelper.GetParentControl(s);
  42. var up = XpandHelper.GetFirstChildControl(parentSplitter.GetPane(1).GetElement().childNodes[0]);
  43. if ((s.firstRowChangedAfterInit!==true || !XpandHelper.IsRootSplitter(parentSplitter)) && up && up.GetMainElement()) {{
  44. up.PerformCallback(s.GetFocusedRowIndex());}}
  45. s.firstRowChangedAfterInit = false; }}", XpandLayoutManager.GetXpandHelperScript());
  46. gridView.Settings.VerticalScrollBarMode = ScrollBarMode.Visible;
  47. }
  48. public IList GetSelectedObjects(object focusedObject) {
  49. return focusedObject != null ? new[] { focusedObject } : new object[0];
  50. }
  51. }
  52. [ListEditor(typeof(object))]
  53. public class XpandASPxGridListEditor : ASPxGridListEditor, IXpandListEditor {
  54. object _lastFiredFocusedObject;
  55. readonly MasterDetailProvider _masterDetailProvider = new MasterDetailProvider();
  56. public event EventHandler<ViewControlCreatedEventArgs> ViewControlsCreated;
  57. public event EventHandler<ColumnCreatedEventArgs> ColumnCreated;
  58. protected virtual void OnColumnCreated(ColumnCreatedEventArgs e) {
  59. EventHandler<ColumnCreatedEventArgs> handler = ColumnCreated;
  60. if (handler != null) handler(this, e);
  61. }
  62. public XpandASPxGridListEditor(IModelListView info)
  63. : base(info) {
  64. }
  65. public override object FocusedObject {
  66. get {
  67. if (MasterDetail)
  68. return _masterDetailProvider.GetFocusedObject(CollectionSource);
  69. return base.FocusedObject;
  70. }
  71. set {
  72. if (MasterDetail) {
  73. if (value != null)
  74. Grid.FocusedRowIndex = Grid.FindVisibleIndexByKeyValue(ObjectSpace.GetKeyValue(value));
  75. } else
  76. base.FocusedObject = value;
  77. }
  78. }
  79. protected override void OnFocusedObjectChanged() {
  80. if (MasterDetail) {
  81. if (_lastFiredFocusedObject != FocusedObject) {
  82. base.OnFocusedObjectChanged();
  83. _lastFiredFocusedObject = FocusedObject;
  84. }
  85. } else {
  86. base.OnFocusedObjectChanged();
  87. }
  88. }
  89. public override IList GetSelectedObjects() {
  90. IList selectedObjects = base.GetSelectedObjects();
  91. if (!MasterDetail || (selectedObjects != null && selectedObjects.Count > 0))
  92. return selectedObjects;
  93. return _masterDetailProvider.GetSelectedObjects(FocusedObject);
  94. }
  95. public bool MasterDetail {
  96. get { return Model.MasterDetailMode == MasterDetailMode.ListViewAndDetailView; }
  97. }
  98. public override SelectionType SelectionType {
  99. get {
  100. return MasterDetail ? _masterDetailProvider.SelectionType : base.SelectionType;
  101. }
  102. }
  103. public override void Setup(CollectionSourceBase collectionSource, XafApplication application) {
  104. base.Setup(collectionSource, application);
  105. CollectionSource.CriteriaApplied += CollectionSource_CriteriaApplied;
  106. }
  107. void CollectionSource_CriteriaApplied(object sender, EventArgs e) {
  108. if (Grid != null && MasterDetail) SetFirstRowChangeAfterInit(Grid, false);
  109. if (Grid != null) Grid.FocusedRowIndex = -1;
  110. OnFocusedObjectChanged();
  111. }
  112. private static void SetFirstRowChangeAfterInit(ASPxGridView grid, bool value) {
  113. grid.ClientSideEvents.Init = string.Format(CultureInfo.InvariantCulture,
  114. "function (s,e) {{ s.firstRowChangedAfterInit = {0};}}", value ? "true" : "false");
  115. }
  116. protected override ASPxGridView CreateGridControl() {
  117. ASPxGridView gridView = base.CreateGridControl();
  118. if (MasterDetail)
  119. _masterDetailProvider.SetupGridView(gridView, OnFocusedObjectChanged);
  120. return gridView;
  121. }
  122. protected override GridViewDataColumn CreateColumn(IModelColumn columnInfo) {
  123. GridViewDataColumn gridViewDataColumnWithInfo = base.CreateColumn(columnInfo);
  124. OnColumnCreated(new ColumnCreatedEventArgs(gridViewDataColumnWithInfo));
  125. return gridViewDataColumnWithInfo;
  126. }
  127. public override void SetControlSelectedObjects(IList<object> objects) {
  128. if (!MasterDetail || objects.Count != 1) {
  129. base.SetControlSelectedObjects(objects);
  130. } else {
  131. Grid.Selection.UnselectAll();
  132. Grid.FocusedRowIndex = Grid.FindVisibleIndexByKeyValue(((WebDataSource)Grid.DataSource).View.GetKeyValue(objects[0]));
  133. OnSelectionChanged();
  134. }
  135. }
  136. public void NotifyViewControlsCreated(XpandListView listView) {
  137. if (listView == null)
  138. throw new ArgumentNullException("listView");
  139. if (ViewControlsCreated != null)
  140. ViewControlsCreated(this, new ViewControlCreatedEventArgs(listView.IsRoot));
  141. }
  142. }
  143. public class ColumnCreatedEventArgs : EventArgs {
  144. private readonly GridViewDataColumn _gridViewDataColumnWithInfo;
  145. public ColumnCreatedEventArgs(GridViewDataColumn gridViewDataColumnWithInfo) {
  146. _gridViewDataColumnWithInfo = gridViewDataColumnWithInfo;
  147. }
  148. public GridViewDataColumn GridViewDataColumnWithInfo {
  149. get { return _gridViewDataColumnWithInfo; }
  150. }
  151. }
  152. }