Hi everyone!
We are doing project with grid hierarchy and tabbed views.
But there are 2 problems:
1. If there is no records in both fields of DataSource, both tabs are not displayed. If only first field has no records, second tab also is not displayed.
2. PageViewMode change does not affect the type of grouping tabs.
I made little project to repeat second problem and partly first.
Also the source code of our class, which we use to abstraction GridView.
Sorry for my english :)
We are doing project with grid hierarchy and tabbed views.
But there are 2 problems:
1. If there is no records in both fields of DataSource, both tabs are not displayed. If only first field has no records, second tab also is not displayed.
2. PageViewMode change does not affect the type of grouping tabs.
I made little project to repeat second problem and partly first.
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.}Also the source code of our class, which we use to abstraction GridView.
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 }}Sorry for my english :)