or


001.public partial class Form1 : Form002.{003. public Form1()004. {005. InitializeComponent();006. 007. var myPrograms = new List<MyProgram>();008. 009. for (int i = 0; i < 5; i++)010. {011. var actions = new List<Action>();012. for (int j = 0; j < 3; j++)013. {014. var newServices1 = new List<Service1>();015. for (int k = 0; k < 3; k++)016. {017. newServices1.Add(new Service1 { Code1 = "code1" + k });018. }019. 020. var newServices2 = new List<Service2>();021. for (int k = 0; k < 3; k++)022. {023. var newService2 = new Service2 { Code2 = "code2" + k };024. newService2.Internals = new List<InternalService>();025. for (int l = 0; l < 3; l++)026. {027. newService2.Internals.Add(new InternalService {Internal = "Internal" + l});028. }029. newServices2.Add(newService2);030. }031. 032. actions.Add(new Action033. {034. Type = "Type" + j,035. // Services1 = newServices1,036. Services2 = newServices2037. });038. }039. 040. var newOne = new MyProgram041. {042. Name = "Name " + i,043. Actions = actions044. };045. 046. myPrograms.Add(newOne);047. }048. 049. 050. 051. 052. var first = new RadGridViewTemplate053. {054. Columns = new BindingColumn[] { new BindingColumn { FieldName = "Name" } },055. Relation = null,056. };057. 058. var second = new RadGridViewTemplate059. {060. ParentTemplate = first,061. Columns = new BindingColumn[] { new BindingColumn { FieldName = "Type" } },062. Relation = new RadRelation("ProgramToAction",063. null, new[]064. {065. "Actions"066. })067. };068. 069. first.ChildTemplates.Add(second);070. 071. var third1 = new RadGridViewTemplate072. {073. ParentTemplate = second,074. Columns = new BindingColumn[] { new BindingColumn { FieldName = "Code1" } },075. Relation = new RadRelation("ActionToOneTimeService", null,076. new[]077. {078. "Services1"079. }),080. CaptionText = "Разовые"081. };082. var third2 = new RadGridViewTemplate083. {084. ParentTemplate = second,085. Columns = new BindingColumn[] { new BindingColumn { FieldName = "Code2" } },086. Relation = new RadRelation("ActionToRegularService", null,087. new[]088. {089. "Services2"090. }),091. CaptionText = "Регулярные"092. };093. 094. second.ChildTemplates.Add(third1);095. second.ChildTemplates.Add(third2);096. 097. var fourth = new RadGridViewTemplate098. {099. ParentTemplate = third2,100. Columns = new BindingColumn[] { new BindingColumn { FieldName = "Internal" } },101. Relation = new RadRelation("ToRegularSeviceInfo", null,102. new[]103. {104. "Internals"105. })106. };107. 108. third2.ChildTemplates.Add(fourth);109. 110. AddBindingColumnRange(rgvMain.MasterTemplate, first.Columns);111. AddGridTemplateRecursivly(rgvMain, rgvMain.MasterTemplate, first.ChildTemplates);112. 113. rgvMain.DataSource = myPrograms;114. rgvMain.TableElement.PageViewMode = PageViewMode.Stack;115. }116. 117. private void AddBindingColumnRange(GridViewTemplate gridViewTemplate, IEnumerable<BindingColumn> list)118. {119. foreach (BindingColumn column in list)120. {121. gridViewTemplate.Columns.Add(column.ToGridViewDataColumn());122. }123. }124. 125. private void AddGridTemplateRecursivly(RadGridView forRelations, GridViewTemplate parentTemplate,126. List<RadGridViewTemplate> radGridViewTemplates)127. {128. if (parentTemplate == null || radGridViewTemplates.Count == 0)129. {130. return;131. }132. 133. foreach (var template in radGridViewTemplates)134. {135. // add child template136. GridViewTemplate childTemplate = template.ToGridViewTemplate();137. AddBindingColumnRange(childTemplate, template.Columns);138. 139. parentTemplate.Templates.Add(childTemplate);140. //parentTemplate.AllowCellContextMenu = false;141. //childTemplate.AllowCellContextMenu = false;142. 143. //add relation144. GridViewRelation firstRelation = template.Relation.ToGridViewRelation();145. firstRelation.ChildTemplate = childTemplate;146. firstRelation.ParentTemplate = parentTemplate;147. forRelations.Relations.Add(firstRelation);148. 149. AddGridTemplateRecursivly(forRelations, childTemplate, template.ChildTemplates);150. }151. }152.}153. 154. 155.class MyProgram156.{157. public string Name { get; set; }158. 159. public List<Action> Actions { get; set; }160.}161. 162.class Action163.{164. public string Type { get; set; }165. 166. public List<Service1> Services1 { get; set; }167. public List<Service2> Services2 { get; set; }168.}169. 170.class Service1171.{172. public string Code1 { get; set; }173.}174. 175.class Service2176.{177. public string Code2 { get; set; }178. 179. public List<InternalService> Internals { get; set; }180.}181. 182.class InternalService183.{184. public string Internal { get; set; } 185.}186. 187.public class BindingColumn188.{189. public BindingColumn()190. {191. IsVisible = true;192. IsReadOnly = true;193. }194. 195. public string FieldName { get; set; }196. public string UniqueName { get; set; }197. public string HeaderText { get; set; }198. public bool IsVisible { get; set; }199. public bool IsReadOnly { get; set; }200. 201. public GridViewDataColumn ToGridViewDataColumn()202. {203. string uniqueName = string.IsNullOrEmpty(UniqueName) ? FieldName + Guid.NewGuid() : UniqueName;204. 205. GridViewDataColumn column = new GridViewTextBoxColumn(uniqueName, FieldName)206. {207. IsVisible = IsVisible,208. ReadOnly = IsReadOnly209. };210. 211. if (!string.IsNullOrEmpty(HeaderText))212. {213. column.HeaderText = HeaderText;214. }215. 216. return column;217. }218.}219. 220.public class RadGridViewTemplate221.{222. public IList<BindingColumn> Columns { get; set; }223. public RadGridViewTemplate ParentTemplate { get; set; }224. public List<RadGridViewTemplate> ChildTemplates { get; private set; }225. public RadRelation Relation { get; set; }226. public string CaptionText { get; set; }227. 228. public RadGridViewTemplate()229. {230. ChildTemplates = new List<RadGridViewTemplate>();231. }232. 233. public GridViewTemplate ToGridViewTemplate()234. {235. var result = new GridViewTemplate236. {237. AllowAddNewRow = false,238. AllowColumnChooser = false,239. AllowDeleteRow = false,240. AutoGenerateColumns = false,241. AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill,242. Caption = CaptionText243. };244. 245. return result;246. }247.}248. 249.public class RadRelation250.{251. public RadRelation(string relationName, IList<string> parentColumnNames, IList<string> childColumnNames)252. {253. RelationName = relationName;254. ParentColumnNames = parentColumnNames;255. ChildColumnNames = childColumnNames;256. }257. 258. public string RelationName { get; set; }259. public IList<string> ParentColumnNames { get; set; }260. public IList<string> ChildColumnNames { get; set; }261. 262. public GridViewRelation ToGridViewRelation()263. {264. var r = new GridViewRelation {RelationName = RelationName};265. 266. if (ChildColumnNames != null)267. {268. foreach (string columnName in ChildColumnNames)269. {270. r.ChildColumnNames.Add(columnName);271. }272. }273. 274. if (ParentColumnNames != null)275. {276. foreach (string columnName in ParentColumnNames)277. {278. r.ParentColumnNames.Add(columnName);279. }280. }281. return r;282. }283.}namespace ProjectControls{ public sealed partial class RadCommonDataListControl : UserControl, IGridViewExtended { private readonly Dictionary<GridViewCommandColumn, Func<object, bool>> _commandColumnDictionary = new Dictionary<GridViewCommandColumn, Func<object, bool>>(); private readonly CommandManager _commandManager; private readonly RadCommonDataListControlPresenter _presenter; private readonly int _rcbHeight; private bool _commandInited; private readonly IList<string> _customSortingFieldNames = new List<string>(); public RadCommonDataListControl() { InitializeComponent(); _presenter = new RadCommonDataListControlPresenter(); _commandManager = CommandManager.Create(components); _rcbHeight = rcbMain.Height; rgvMain.AllowCellContextMenu = false; } #region ShowButtons [Browsable(true)] public bool ShowAddButton { [UsedImplicitly] get { return cbbAdd.Visibility == ElementVisibility.Visible; } set { cbbAdd.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiAdd.Visibility = cbbAdd.Visibility; } } [Browsable(true)] public bool ShowExportButton { [UsedImplicitly] get { return cbbExport.Visibility == ElementVisibility.Visible; } set { cbbExport.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiExport.Visibility = cbbExport.Visibility; } } [Browsable(true)] public bool ShowImportButton { [UsedImplicitly] get { return cbbImport.Visibility == ElementVisibility.Visible; } set { cbbImport.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiImport.Visibility = cbbImport.Visibility; } } [Browsable(true)] public bool ShowClientCardButton { [UsedImplicitly] get { return cbbShowClientCard.Visibility == ElementVisibility.Visible; } set { cbbShowClientCard.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiShowClientCard.Visibility = cbbShowClientCard.Visibility; } } [Browsable(true)] public bool ShowPrintButton { [UsedImplicitly] get { return cbbPrint.Visibility == ElementVisibility.Visible; } set { cbbPrint.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiPrint.Visibility = cbbPrint.Visibility; } } [Browsable(true)] public bool ShowHistoryButton { [UsedImplicitly] get { return cbbShowHistory.Visibility == ElementVisibility.Visible; } set { cbbShowHistory.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiShowHistory.Visibility = cbbShowHistory.Visibility; } } [Browsable(true)] public bool ShowAddExtraButton { [UsedImplicitly] get { return cbbAddExtra.Visibility == ElementVisibility.Visible; } set { cbbAddExtra.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiAddExtra.Visibility = cbbAddExtra.Visibility; } } [Browsable(true)] public bool ShowArchivedToogleButton { [UsedImplicitly] get { return cbbShowArchived.Visibility == ElementVisibility.Visible; } set { cbbShowArchived.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiShowArchived.Visibility = cbbShowArchived.Visibility; } } [Browsable(true)] public bool ShowEditButton { [UsedImplicitly] get { return cbbEdit.Visibility == ElementVisibility.Visible; } set { cbbEdit.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiEdit.Visibility = cbbEdit.Visibility; } } [Browsable(true)] public bool ShowDeleteButton { [UsedImplicitly] get { return cbbDelete.Visibility == ElementVisibility.Visible; } set { cbbDelete.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiDelete.Visibility = cbbDelete.Visibility; } } [Browsable(true)] public bool ShowAddExtraButtonMulti { [UsedImplicitly] get { return cbbAddExtraMulti.Visibility == ElementVisibility.Visible; } set { cbbAddExtraMulti.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; } } [Browsable(true)] public bool ShowRestoreButton { [UsedImplicitly] get { return cbbRestore.Visibility == ElementVisibility.Visible; } set { cbbRestore.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiRestore.Visibility = cbbRestore.Visibility; } } [Browsable(true)] public bool ShowRefreshButton { [UsedImplicitly] get { return cbbRefresh.Visibility == ElementVisibility.Visible; } set { cbbRefresh.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiRefresh.Visibility = cbbRefresh.Visibility; } } [Browsable(true)] public bool ShowExpandAllButton { [UsedImplicitly] get { return cbbExpandAll.Visibility == ElementVisibility.Visible; } set { cbbExpandAll.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiExpandAll.Visibility = cbbExpandAll.Visibility; } } [Browsable(true)] public bool ShowCollapseAllButton { [UsedImplicitly] get { return cbbCollapseAll.Visibility == ElementVisibility.Visible; } set { cbbCollapseAll.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiCollapseAll.Visibility = cbbCollapseAll.Visibility; } } [Browsable(true)] public bool ShowCheckAllButton { [UsedImplicitly] get { return cbbCheckAll.Visibility == ElementVisibility.Visible; } set { cbbCheckAll.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiCheckAll.Visibility = cbbCheckAll.Visibility; } } [Browsable(true)] public bool ShowClearSelectionButton { [UsedImplicitly] get { return cbbClearSelection.Visibility == ElementVisibility.Visible; } set { cbbClearSelection.Visibility = value ? ElementVisibility.Visible : ElementVisibility.Collapsed; rmiClearSelection.Visibility = cbbClearSelection.Visibility; } } #endregion [Browsable(true)] public string AddExtraButtonText { [UsedImplicitly] get { return cbbAddExtra.Text; } set { if (!string.IsNullOrEmpty(value)) { cbbAddExtra.Text = value; rmiAddExtra.Text = value; } } } [Browsable(true)] public string AddButtonText { [UsedImplicitly] get { return cbbAdd.Text; } set { if (!string.IsNullOrEmpty(value)) { cbbAdd.Text = value; rmiAdd.Text = value; } } } [Browsable(true)] public bool ShowCommandBar { [UsedImplicitly] get { return rcbMain.Visible; } set { rcbMain.Height = value ? _rcbHeight : 0; rcbMain.Visible = value; rcbMain.Enabled = value; } } public int RowCount { get { return rgvMain.RowCount; } } [Browsable(true)] public string ToolTipAddButton { [UsedImplicitly] get { return cbbAdd.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbAdd.ToolTipText = value; } } } [Browsable(true)] public string ToolTipImportButton { [UsedImplicitly] get { return cbbImport.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbImport.ToolTipText = value; } } } [Browsable(true)] public string ToolTipClientCardButton { [UsedImplicitly] get { return cbbShowClientCard.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbShowClientCard.ToolTipText = value; } } } [Browsable(true)] public string ToolTipAddExtraButton { [UsedImplicitly] get { return cbbAddExtra.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbAddExtra.ToolTipText = value; } } } [Browsable(true)] public string ToolTipEditButton { [UsedImplicitly] get { return cbbEdit.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbEdit.ToolTipText = value; } } } [Browsable(true)] public string ToolTipDeleteButton { [UsedImplicitly] get { return cbbDelete.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbDelete.ToolTipText = value; } } } [Browsable(true)] public string ToolTipRefreshButton { [UsedImplicitly] get { return cbbRefresh.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbRefresh.ToolTipText = value; } } } [Browsable(true)] public string ToolTipArchivedButton { [UsedImplicitly] get { return cbbShowArchived.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbShowArchived.ToolTipText = value; } } } [Browsable(true)] public string ToolTipExpandAll { [UsedImplicitly] get { return cbbExpandAll.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbExpandAll.ToolTipText = value; } } } [Browsable(true)] public string ToolTipCollapseAll { [UsedImplicitly] get { return cbbCollapseAll.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbCollapseAll.ToolTipText = value; } } } [Browsable(true)] public string ToolTipCheckAllButton { [UsedImplicitly] get { return cbbCheckAll.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbCheckAll.ToolTipText = value; } } } [Browsable(true)] public string ToolTipClearSelectionButton { [UsedImplicitly] get { return cbbClearSelection.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbClearSelection.ToolTipText = value; } } } [Browsable(true)] public string ToolTipAddExtraMulti { [UsedImplicitly] get { return cbbAddExtraMulti.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbAddExtraMulti.ToolTipText = value; } } } [Browsable(true)] public string ToolTipRestoreButton { [UsedImplicitly] get { return cbbRestore.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbRestore.ToolTipText = value; } } } [Browsable(true)] public string ToolTipHistoryButton { [UsedImplicitly] get { return cbbShowHistory.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbShowHistory.ToolTipText = value; } } } [Browsable(true)] public string ToolTipPrintButton { [UsedImplicitly] get { return cbbPrint.ToolTipText; } set { if (!string.IsNullOrEmpty(value)) { cbbPrint.ToolTipText = value; } } } public bool IsNeedShowArchived { get; private set; } public void InitializeCommands(IEnumerable<IGridCommand> commands) { //TODO: 1. Опять не дизэйблится menuItem в контекстном меню //TODO: 2. Не работает редактиравние по дабл клинку. if (_commandInited) return; rcbMain.BindingContext = new BindingContext(); foreach (IGridCommand command in commands) { switch (command.CommandType) { case GridCommandType.Add: _commandManager.Bind(command, cbbAdd); _commandManager.Bind(command, rmiAdd); break; case GridCommandType.AddExtra: _commandManager.Bind(command, cbbAddExtra); _commandManager.Bind(command, rmiAddExtra); break; case GridCommandType.AddExtraMulti: var radMenuItem = new RadMenuItem { Text = command.Text }; cbbAddExtraMulti.Items.Add(radMenuItem); _commandManager.Bind(command, radMenuItem); break; case GridCommandType.Edit: _commandManager.Bind(command, cbbEdit); _commandManager.Bind(command, rmiEdit); _commandManager.Bind(command, rgvMain); break; case GridCommandType.Delete: _commandManager.Bind(command, cbbDelete); _commandManager.Bind(command, rmiDelete); break; case GridCommandType.Refresh: _commandManager.Bind(command, cbbRefresh); _commandManager.Bind(command, rmiRefresh); break; case GridCommandType.Restore: _commandManager.Bind(command, cbbRestore); _commandManager.Bind(command, rmiRestore); break; case GridCommandType.CheckAll: _commandManager.Bind(command, cbbCheckAll); _commandManager.Bind(command, rmiCheckAll); break; case GridCommandType.ClearSelection: _commandManager.Bind(command, cbbClearSelection); _commandManager.Bind(command, rmiClearSelection); break; case GridCommandType.ShowHistory: _commandManager.Bind(command, cbbShowHistory); _commandManager.Bind(command, rmiShowHistory); break; case GridCommandType.ShowArchived: _commandManager.Bind(command, cbbShowArchived); _commandManager.Bind(command, rmiShowArchived); break; case GridCommandType.Print: _commandManager.Bind(command, cbbPrint); _commandManager.Bind(command, rmiPrint); break; case GridCommandType.Export: _commandManager.Bind(command, cbbExport); _commandManager.Bind(command, rmiExport); break; case GridCommandType.Import: _commandManager.Bind(command, cbbImport); _commandManager.Bind(command, rmiImport); break; case GridCommandType.ShowClientCard: _commandManager.Bind(command, cbbShowClientCard); _commandManager.Bind(command, rmiShowClientCard); break; case GridCommandType.ExpandAll: _commandManager.Bind(command, cbbExpandAll); _commandManager.Bind(command, rmiExpandAll); break; case GridCommandType.CollapseAll: _commandManager.Bind(command, cbbCollapseAll); _commandManager.Bind(command, rmiCollapseAll); break; default: throw new ArgumentOutOfRangeException(); } } _commandInited = true; } public GridCellElement SelectedCell { get { return rgvMain.CurrentCell; } } public void SetDatasource<T>(BindingList<T> list) { CheckColumn(); rgvMain.SmartUpdate(list); OnSelectionChanged(); } object IGridView.SelectedItem { get { return rgvMain.GetSelectedItem(); } } public MasterGridViewTemplate MasterTemplate { get { return rgvMain.MasterTemplate; } } public object DataSource { get { return rgvMain.DataSource; } } private void CheckColumn() { if (rgvMain.ColumnCount == 0) { throw new InvalidOperationException("No columns in gridview! Setting canceled!"); } } private void grdMyGrid_ToolTipTextNeeded(object sender, ToolTipTextNeededEventArgs e) {// var element = sender as GridHeaderCellElement;// if (element != null)// {// e.ToolTipText = element.Text;// } GridDataCellElement cell = sender as GridDataCellElement; if (cell != null && cell.Value != null) { e.ToolTipText = cell.Value.ToString(); } } public void DisableContextMemu() { rcmmMain.SetRadContextMenu(rgvMain, null); } public void SetColumnVisibleStatus(string columnName, bool value) { if (rgvMain.Columns[columnName] != null) { rgvMain.Columns[columnName].IsVisible = value; } } public int? GetSelectedRowIndex() { return rgvMain.GetSelectedRowIndex(); } public T SelectedItem<T>() { return rgvMain.GetSelectedItem<T>(); } public void AddBindingColumnRange(IEnumerable<BindingColumn> list) { foreach (BindingColumn column in list) { AddBindingColumn(column, rgvMain.Columns); } } private void RgvMainSelectionChanged(object sender, EventArgs e) { OnSelectionChanged(); } public void SetFilteringStatus(bool status) { rgvMain.EnableFiltering = status; rgvMain.MasterTemplate.EnableFiltering = status; } public void ExecuteAddCommand() { if (_presenter == null || _presenter.AddCommand == null) { throw new NullReferenceException("AddCommand"); } _presenter.AddCommand.Execute(); } public void ExecuteEditCommand() { if (_presenter == null || _presenter.EditCommand == null) { throw new NullReferenceException("EditCommand"); } _presenter.EditCommand.Execute(); } public void ExecuteShowHistoryCommand() { if (_presenter == null || _presenter.ShowHistoryCommand == null) { throw new NullReferenceException("ShowHistoryCommand"); } _presenter.ShowHistoryCommand.Execute(); } public void ExecuteDeleteCommand() { if (_presenter == null || _presenter.DeleteCommand == null) { throw new NullReferenceException("DeleteCommand"); } _presenter.DeleteCommand.Execute(); } public T GetDataInRow<T>(int index) { return (T) rgvMain.Rows[index].DataBoundItem; } //public void CheckColumn(int rowIndex, int columnIndex) //{ // rgvMain.Rows[rowIndex].Cells[columnIndex].Value = true; //} public void ExecuteRefreshCommand() { cbbRefresh.CallDoClick(null); } private void rgvMain_ContextMenuOpening(object sender, ContextMenuOpeningEventArgs e) { if (e.ContextMenuProvider is GridHeaderCellElement) { e.Cancel = true; } } private void rgvMain_ValueChanged(object sender, EventArgs e) { rgvMain.EndEdit(); } public void ExecutePrintCommand() { if (_presenter != null) { if (_presenter.PrintCommand != null && _presenter.PrintCommand.Enabled) { _presenter.PrintCommand.Execute(); } } } private void cbbShowArchived_MouseDown(object sender, MouseEventArgs e) { IsNeedShowArchived = !IsNeedShowArchived; } private void rmiShowArchived_MouseDown(object sender, MouseEventArgs e) { IsNeedShowArchived = !IsNeedShowArchived; } private void rmiShowArchived_ToggleStateChanged(object sender, StateChangedEventArgs args) { cbbShowArchived.ToggleStateChanged -= cbbShowArchived_ToggleStateChanged; cbbShowArchived.InvertToggleState(); cbbShowArchived.ToggleStateChanged += cbbShowArchived_ToggleStateChanged; } private void cbbShowArchived_ToggleStateChanged(object sender, StateChangedEventArgs args) { rmiShowArchived.ToggleStateChanged -= rmiShowArchived_ToggleStateChanged; rmiShowArchived.InvertToggleState(); rmiShowArchived.ToggleStateChanged += rmiShowArchived_ToggleStateChanged; } private void rgvGroupSummaryEvaluate(object sender, GroupSummaryEvaluationEventArgs e) { if (e.Group.Header == string.Empty) { e.FormatString = " "; e.Group.Expand(); } else { e.FormatString = e.Group.Header; } } public void SetGroupCustomExpanding() { rgvMain.GroupSummaryEvaluate += rgvGroupSummaryEvaluate; } public void AddGrouping(GridGroupDescriptor groupDescriptor) { rgvMain.EnableGrouping = true; rgvMain.GroupDescriptors.Clear(); var descriptor = new GroupDescriptor(); GridViewDataColumn gridViewDataColumn = rgvMain.MasterTemplate.Columns.GetColumnByFieldName(groupDescriptor.UniqueGroupColumnName) .FirstOrDefault(); if (gridViewDataColumn != null) { ListSortDirection listSortDirection = groupDescriptor.SortDirection == GridSortDirection.Ascending ? ListSortDirection.Ascending : ListSortDirection.Descending; descriptor.GroupNames.Add(gridViewDataColumn.Name, listSortDirection); rgvMain.GroupDescriptors.Add(descriptor); if (groupDescriptor.IsNeedExpand) { rgvMain.MasterTemplate.ExpandAllGroups(); } } } public void SetHierarchy(string childColumn, string columnFieldName, string columnHeaderText, string visibleColumn) { rgvMain.MasterTemplate.Templates.Clear(); rgvMain.Templates.Clear(); rgvMain.Relations.Clear(); rgvMain.ShowRowHeaderColumn = false; var template = new GridViewTemplate { AllowAddNewRow = false, ReadOnly = true, ShowRowHeaderColumn = false, AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill, AllowCellContextMenu = false }; rgvMain.Templates.Add(template); template.Columns.Add(new GridViewTextBoxColumn { FieldName = columnFieldName, HeaderText = columnHeaderText }); var relation = new GridViewRelation(rgvMain.MasterTemplate, template); relation.ChildColumnNames.Add(childColumn); rgvMain.Relations.Add(relation); foreach (GridViewDataColumn column in template.Columns) { column.IsVisible = column.FieldName == visibleColumn; } } private void rgvMain_ViewCellFormatting(object sender, CellFormattingEventArgs e) { if (e.CellElement.RowIndex <= -1) return; var column = e.CellElement.ColumnInfo as GridViewCommandColumn; Func<object, bool> func; if (column == null || !_commandColumnDictionary.TryGetValue(column, out func)) return; var commandCell = (GridCommandCellElement)e.CellElement; var buttonElement = (RadButtonElement)commandCell.Children[0]; if (func != null) { buttonElement.Enabled = func(e.Row.DataBoundItem); } } public bool BoldHeaderText { get; set; } [DebuggerStepThrough] private bool IsExpandable(GridViewRowInfo rowInfo) { return rowInfo.ChildRows != null && rowInfo.ChildRows.Count > 0; } private void rgvMain_ChildViewExpanding(object sender, ChildViewExpandingEventArgs e) { e.Cancel = !IsExpandable(e.ParentRow); } [Browsable(true)] public event CommandCellClickEventHandler CommandCellClick { add { rgvMain.CommandCellClick += value; } remove { rgvMain.CommandCellClick -= value; } } private void rgvMain_ViewCellFormatting_1(object sender, CellFormattingEventArgs e) { var cell = e.CellElement as GridGroupExpanderCellElement; if (cell != null && e.CellElement.RowElement is GridDataRowElement) { cell.Expander.Visibility = !IsExpandable(cell.RowInfo) ? ElementVisibility.Hidden : ElementVisibility.Visible; } e.CellElement.DrawFill = false; e.CellElement.BorderWidth = 0; } public void ShowCellSelectionBorder() { rgvMain.ViewCellFormatting += CellSelectionBorder; } private void NaturalSortingByField(object sender, GridViewCustomSortingEventArgs e) { e.Handled = SortTemplates(rgvMain.MasterTemplate, e); } private bool SortTemplate(GridViewTemplate template, GridViewCustomSortingEventArgs e) { bool handled = false; foreach (var name in _customSortingFieldNames) { int descriptorIndex = -1; for (int i = 0; i < template.SortDescriptors.Count; i++) { if (template.SortDescriptors[i].PropertyName == name) { descriptorIndex = i; } } if (descriptorIndex != -1) { int columnIndex = -1; for (int i = 0; i < template.ColumnCount; i++) { if (template.Columns[i].Name == template.SortDescriptors[descriptorIndex].PropertyName) { columnIndex = i; } } var row1Code = (string)e.Row1.Cells[columnIndex].Value; var row2Code = (string)e.Row2.Cells[columnIndex].Value; e.SortResult = ServiceFormCodeLogicalComparer.Compare(row1Code, row2Code); if (template.SortDescriptors[descriptorIndex].Direction == ListSortDirection.Descending) { e.SortResult *= -1; } handled = true; } } return handled; } private bool SortTemplates(GridViewTemplate template, GridViewCustomSortingEventArgs e) { if (template == null) { return false; } bool handled = SortTemplate(template, e); foreach (var child in template.Templates) { handled |= SortTemplates(child, e); } return handled; } private void CellSelectionBorder(object sender, CellFormattingEventArgs e) { //TODO: Залепуха для отображения рамки селектора в нижнем уровне журнала ИПР if (e.CellElement.IsCurrent && e.CellElement.ViewTemplate.Templates.Count == 0) { e.CellElement.BorderWidth = 2; return; } } public void ExportToExcel(string filepath) { var excelMl = new ExportToExcelML(rgvMain); excelMl.RunExport(filepath); } #region Events [Browsable(true)] public event EventHandler SelectionChanged; public event GridViewCellEventHandler CellValueChanged; private void OnSelectionChanged() { EventHandler handler = SelectionChanged; if (handler != null) handler(this, EventArgs.Empty); } private void rgvMain_CellValueChanged(object sender, GridViewCellEventArgs e) { if (CellValueChanged != null) { CellValueChanged(sender, e); } } #endregion #region Hierarchical grid private void AddBindingColumnRange(GridViewTemplate gridViewTemplate, IEnumerable<BindingColumn> list) { foreach (BindingColumn column in list) { AddBindingColumn(column, gridViewTemplate.Columns); } } private void AddBindingColumn(BindingColumn bindingColumn, GridViewColumnCollection columns) //GridViewTemplate gridViewTemplate = null) { GridViewDataColumn column = bindingColumn.ToGridViewDataColumn(); //TODO: Если содержится колонка с чекбоксом в хедере, то нужно сделать хедер больше по высоте. if (bindingColumn.ColumnType == RadGridViewColumnType.CheckBoxColumnCheckableHeader) { rgvMain.MasterView.TableHeaderRow.MinHeight = 21; } var commandBindingColumn = bindingColumn as CommandBindingColumn; var gridViewCommandColumn = column as GridViewCommandColumn; if (commandBindingColumn != null && gridViewCommandColumn != null) { _commandColumnDictionary.Add(gridViewCommandColumn, commandBindingColumn.CanExecute); } if (bindingColumn.IsNaturalSorting) { if (!rgvMain.EnableCustomSorting) { rgvMain.EnableCustomSorting = true; rgvMain.CustomSorting += NaturalSortingByField; } if (!columns.Owner.EnableCustomSorting) { columns.Owner.EnableCustomSorting = true; } _customSortingFieldNames.Add(column.Name); } if (bindingColumn is ConditionalEditingBindingColumn) { rgvMain.CellBeginEdit -= RadGridViewCellBeginEdit; // чтобы обработчик не добавлялся два раза rgvMain.CellBeginEdit += RadGridViewCellBeginEdit; column.Tag = bindingColumn; } columns.Add(column); } void RadGridViewCellBeginEdit(object sender, GridViewCellCancelEventArgs e) { var conditionalEditingBindingColumn = e.Column.Tag as ConditionalEditingBindingColumn; if (conditionalEditingBindingColumn == null) { return; } int columnIndex = -1; for (int i = 0; i < rgvMain.ColumnCount; i++) { if (rgvMain.Columns[i].Name.Contains(conditionalEditingBindingColumn.ConditionName)) { columnIndex = i; break; } } if (columnIndex != -1) { if ((e.Row.Cells[columnIndex].Value as bool?) == true) { e.Cancel = true; } } } public void AddGridTemplate(RadGridViewTemplate radGridViewTemplate) { rgvMain.EnableGrouping = false; rgvMain.GridViewElement.DrawBorder = false; rgvMain.GridViewElement.GroupPanelElement.DrawBorder = false; rgvMain.MasterTemplate.AllowColumnChooser = false; AddBindingColumnRange(rgvMain.MasterTemplate, radGridViewTemplate.Columns); AddGridTemplateRecursivly(rgvMain, rgvMain.MasterTemplate, radGridViewTemplate.ChildTemplates); } public List<string> DayOfWeeksGroupHeader { get; private set; } public void AddGroupHeaderIpr(GridViewTemplate childTemplate, List<string> groupHeaderText) { DayOfWeeksGroupHeader = groupHeaderText; rgvMain.ViewCellFormatting += BoldDaysOfWeekHeader; var columnGroupsView = new ColumnGroupsViewDefinition(); int index = 0; int i = 0; foreach (var header in groupHeaderText) { columnGroupsView.ColumnGroups.Add(new GridViewColumnGroup(header)); columnGroupsView.ColumnGroups[index].Rows.Add(new GridViewColumnGroupRow()); //Три колонки в одном дне недели columnGroupsView.ColumnGroups[index].Rows[0].Columns.Add(childTemplate.Columns[i++]); columnGroupsView.ColumnGroups[index].Rows[0].Columns.Add(childTemplate.Columns[i++]); columnGroupsView.ColumnGroups[index].Rows[0].Columns.Add(childTemplate.Columns[i++]); index++; } childTemplate.ViewDefinition = columnGroupsView; } private void BoldDaysOfWeekHeader(object sender, CellFormattingEventArgs e) { var c = e.CellElement as GridHeaderCellElement; if (c != null && DayOfWeeksGroupHeader != null) { if (DayOfWeeksGroupHeader.Contains(e.CellElement.Text)) { // e.CellElement.DrawBorder = true; // e.CellElement.DrawFill = true; // e.CellElement.BackColor = Color.LightSalmon; c.Font = new Font(Font,FontStyle.Bold); } } } private void AddGridTemplateRecursivly(RadGridView forRelations, GridViewTemplate parentTemplate, List<RadGridViewTemplate> radGridViewTemplates) { if (parentTemplate == null || radGridViewTemplates.Count == 0) { return; } foreach (var template in radGridViewTemplates) { // add child template GridViewTemplate childTemplate = template.ToGridViewTemplate(); AddBindingColumnRange(childTemplate, template.Columns); parentTemplate.Templates.Add(childTemplate); parentTemplate.AllowCellContextMenu = false; childTemplate.AllowCellContextMenu = false; //add relation GridViewRelation firstRelation = template.Relation.ToGridViewRelation(); firstRelation.ChildTemplate = childTemplate; firstRelation.ParentTemplate = parentTemplate; forRelations.Relations.Add(firstRelation); AddGridTemplateRecursivly(forRelations, childTemplate, template.ChildTemplates); } } public class RadRelation { public RadRelation(string relationName, IList<string> parentColumnNames, IList<string> childColumnNames) { RelationName = relationName; ParentColumnNames = parentColumnNames; ChildColumnNames = childColumnNames; } public string RelationName { get; set; } public IList<string> ParentColumnNames { get; set; } public IList<string> ChildColumnNames { get; set; } public GridViewRelation ToGridViewRelation() { var r = new GridViewRelation { RelationName = RelationName }; if (ChildColumnNames != null) { foreach (string columnName in ChildColumnNames) { r.ChildColumnNames.Add(columnName); } } if (ParentColumnNames != null) { foreach (string columnName in ParentColumnNames) { r.ParentColumnNames.Add(columnName); } } return r; } } #endregion public void CollapseAll() { rgvMain.MasterTemplate.CollapseAll(); } public void ExpandAll() { rgvMain.MasterTemplate.ExpandAll(); } } public enum GridSortDirection { Ascending, [UsedImplicitly] Descending, [UsedImplicitly] None }}



