private void Rebuild() { // ищем отображаемые свойства как пересечение множеств свойств выбранных объектов var selectedProperties = new List<PropertyInfo>(); if (selectedObjects != null) { var chartObjectPropertiesDict = new Dictionary<object, List<PropertyInfo>>(); var allProperties = new List<PropertyInfo>(); foreach (var chartObject in selectedObjects) { var chartObjectProperties = chartObject.GetType().GetProperties().Where(IsBrowsable).ToList(); chartObjectPropertiesDict.Add(chartObject, chartObjectProperties); allProperties.AddRange(chartObjectProperties); } // ищем пересечение foreach (var property in allProperties) { var add = true; foreach (var chartObject in selectedObjects) { // одинаковые по сути свойства представлены разными объектами PropertyInfo, // а IEquatable.Equals сравнивает ссылки, поэтому проверку на равенство выполняем самостоятельно if (!chartObjectPropertiesDict[chartObject].Any(p => p.Name == property.Name && p.PropertyType == property.PropertyType)) { add = false; break; } } if (add && !selectedProperties.Any(p => p.Name == property.Name && p.PropertyType == property.PropertyType)) selectedProperties.Add(property); } } else if (selectedObject != null) selectedProperties = selectedObject.GetType().GetProperties().Where(IsBrowsable).ToList(); // определяем категории var categories = new List<Cortege2<string, int>>(); foreach (var property in selectedProperties) { var category = GetCategory(property); if (!string.IsNullOrEmpty(category) && !categories.Exists(c => c.a == category)) categories.Add(new Cortege2<string, int>(category, GetOrder(property).b)); } // сортируем категории categories.Sort((arg1, arg2) => arg1.b - arg2.b); // для каждой категории создаем по вкладке tabControl.TabPages.Clear(); var blankRow = new FastPropertyGridRow(); foreach (var category in categories) { tabControl.TabPages.Add(category.a, category.a); var fastGrid = new FastGrid.FastGrid {Dock = DockStyle.Fill, FitWidth = true, CaptionHeight = 0}; fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.Title))); fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.StringValue)) {ColumnFont = new Font(Font, FontStyle.Bold)}); fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.Property)) {Visible = false}); fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.Value)) {Visible = false}); fastGrid.UserHitCell += UserHitCell; tabControl.TabPages[category.a].Controls.Add(fastGrid); // определяем свойства внутри категории var propertiesInCategory = new List<Cortege2<PropertyInfo, int>>(); foreach (var property in selectedProperties) { if (GetCategory(property) != category.a) continue; propertiesInCategory.Add(new Cortege2<PropertyInfo, int>(property, GetOrder(property).a)); } // сортируем свойства propertiesInCategory.Sort((arg1, arg2) => arg1.b - arg2.b); // создаем данные типа "имя-значение" var data = new List<FastPropertyGridRow>(); foreach (var property in propertiesInCategory) { // в случае множества объектов, null - фиктивное значение (значение, используемое для отображения в случае различных значений) object value = null; if (selectedObjects != null) { var allValues = GetDistinctPropertyValues(selectedObjects, property.a); if (allValues.Count == 1) value = allValues.First(); } else if (selectedObject != null) value = property.a.GetValue(selectedObject, null); data.Add(new FastPropertyGridRow { Title = GetDisplayName(property.a), Value = value, Property = property.a, StringValue = GetStringValue(value, property.a) }); } fastGrid.DataBind(data); // фиксируем ширину колонки с наименованием fastGrid.CheckSize(true); } RebuildSample(); }
private void Rebuild() { // ищем отображаемые свойства как пересечение множеств свойств выбранных объектов var selectedProperties = new List <PropertyInfo>(); if (selectedObjects != null) { var chartObjectPropertiesDict = new Dictionary <object, List <PropertyInfo> >(); var allProperties = new List <PropertyInfo>(); foreach (var chartObject in selectedObjects) { var chartObjectProperties = chartObject.GetType().GetProperties().Where(IsBrowsable).ToList(); chartObjectPropertiesDict.Add(chartObject, chartObjectProperties); allProperties.AddRange(chartObjectProperties); } // ищем пересечение foreach (var property in allProperties) { var add = true; foreach (var chartObject in selectedObjects) { // одинаковые по сути свойства представлены разными объектами PropertyInfo, // а IEquatable.Equals сравнивает ссылки, поэтому проверку на равенство выполняем самостоятельно if (chartObjectPropertiesDict[chartObject].Any( p => p.Name == property.Name && p.PropertyType == property.PropertyType)) { continue; } add = false; break; } if (add && !selectedProperties.Any(p => p.Name == property.Name && p.PropertyType == property.PropertyType)) { selectedProperties.Add(property); } } } else if (selectedObject != null) { selectedProperties = selectedObject.GetType().GetProperties().Where(IsBrowsable).ToList(); } // определяем категории var categories = new List <Cortege2 <string, int> >(); foreach (var property in selectedProperties) { var category = GetCategory(property); if (!string.IsNullOrEmpty(category) && !categories.Exists(c => c.a == category)) { categories.Add(new Cortege2 <string, int>(category, GetOrder(property).b)); } } // сортируем категории categories.Sort((arg1, arg2) => arg1.b - arg2.b); // для каждой категории создаем по вкладке tabControl.TabPages.Clear(); var blankRow = new FastPropertyGridRow(); foreach (var category in categories) { tabControl.TabPages.Add(category.a, category.a); var fastGrid = new FastGrid.FastGrid { Dock = DockStyle.Fill, FitWidth = true, CaptionHeight = 0 }; Grid = fastGrid; fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.Title))); fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.StringValue)) { ColumnFont = new Font(Font, FontStyle.Bold) }); fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.Property)) { Visible = false }); fastGrid.Columns.Add(new FastColumn(blankRow.Property(p => p.Value)) { Visible = false }); fastGrid.UserHitCell += UserHitCell; tabControl.TabPages[category.a].Controls.Add(fastGrid); // определяем свойства внутри категории var propertiesInCategory = new List <Cortege2 <PropertyInfo, int> >(); foreach (var property in selectedProperties) { if (GetCategory(property) != category.a) { continue; } propertiesInCategory.Add(new Cortege2 <PropertyInfo, int>(property, GetOrder(property).a)); } // сортируем свойства propertiesInCategory.Sort((arg1, arg2) => arg1.b - arg2.b); // создаем данные типа "имя-значение" var data = new List <FastPropertyGridRow>(); foreach (var property in propertiesInCategory) { // в случае множества объектов, null - фиктивное значение (значение, используемое для отображения в случае различных значений) object value = null; if (selectedObjects != null) { var allValues = GetDistinctPropertyValues(selectedObjects, property.a); if (allValues.Count == 1) { value = allValues.First(); } } else if (selectedObject != null) { value = property.a.GetValue(selectedObject, null); } data.Add(new FastPropertyGridRow { Title = GetDisplayName(property.a), Value = value, Property = property.a, StringValue = GetStringValue(value, property.a) }); } fastGrid.DataBind(data); // фиксируем ширину колонки с наименованием fastGrid.CheckSize(true); fastGrid.Visible = true; } RebuildSample(); }
// открытие стандартного редактора в зависимости от типа свойства private void OpenBaseEditor(PropertyInfo property, FastGrid.FastGrid fastGrid, int rowIndex, FastColumn col) { var coords = fastGrid.GetCellCoords(col, rowIndex); var blankRow = new FastPropertyGridRow(); var cellValue = fastGrid.rows[rowIndex].cells[fastGrid.Columns.FindIndex(c => c.PropertyName == blankRow.Property(p => p.Value))].CellValue; var propType = property.PropertyType; if ((propType == typeof (bool) || propType.IsEnum)) { var pop = new PopupListBox(cellValue, rowIndex, col, propType, UpdateObject, fastGrid); pop.ShowOptions(coords.X, coords.Y); return; } if ((propType == typeof (string) || Converter.IsConvertable(propType))) { // редактор подставляется в FastGrid.PopupTextBox try { var pop = new PopupTextBox(cellValue, col.ResultedWidth, fastGrid.CellHeight, rowIndex, col, property, null); pop.OnValueUpdated += UpdateObject; pop.Show(fastGrid, coords); } catch(Exception ex) { Logger.Error("FastPropertyGrid.OpenBaseEditor", ex); } return; } }
/// <summary> /// открытие стандартного редактора в зависимости от типа свойства /// </summary> private void OpenBaseEditor(PropertyInfo property, FastGrid.FastGrid fastGrid, int rowIndex, FastColumn col) { var coords = fastGrid.GetCellCoords(col, rowIndex); var blankRow = new FastPropertyGridRow(); var cellValue = fastGrid.rows[rowIndex].cells[fastGrid.Columns.FindIndex(c => c.PropertyName == blankRow.Property(p => p.Value))].CellValue; var propType = property.PropertyType; if ((propType == typeof(bool) || propType.IsEnum)) { var pop = new PopupListBox(cellValue, rowIndex, col, propType, UpdateObject, fastGrid); pop.ShowOptions(coords.X, coords.Y); return; } if ((propType == typeof(string) || Converter.IsConvertable(propType))) { // редактор подставляется в FastGrid.PopupTextBox try { var pop = new PopupTextBox(cellValue, col.ResultedWidth, fastGrid.CellHeight, rowIndex, col, property, null); pop.OnValueUpdated += UpdateObject; pop.Show(fastGrid, coords); } catch (Exception ex) { Logger.Error("FastPropertyGrid.OpenBaseEditor", ex); } return; } }