/// <summary>
        /// Class constructor.  Initializes various elements
        /// </summary>
        public СортировщикКолонок(PropertyInfo[] ОтображаемыеСвойства)
        {
            // Initialize the column to '0'
            ColumnToSort = 0;

            // Initialize the sort order to 'none'
            OrderOfSort = SortOrder.None;

            this.ОтображаемыеСвойства = ОтображаемыеСвойства;

            // создаём сравниватели для типа
            this.Сравниватели = new IComparer[ОтображаемыеСвойства.Count()];
            int i = 0;

            foreach (var Свойство in ОтображаемыеСвойства)
            {
                var rt = Свойство.GetGetMethod().ReturnType;
                if (rt == typeof(byte))
                {
                    if (this.Сравниватель_Byte == null)
                    {
                        this.Сравниватель_Byte = new Сравниватель_Byte();
                    }
                    Сравниватели[i] = this.Сравниватель_Byte;
                }
                else if (rt == typeof(sbyte))
                {
                    if (this.Сравниватель_SByte == null)
                    {
                        this.Сравниватель_SByte = new Сравниватель_SByte();
                    }
                    Сравниватели[i] = this.Сравниватель_SByte;
                }
                else if (rt == typeof(short))
                {
                    if (this.Сравниватель_Int16 == null)
                    {
                        this.Сравниватель_Int16 = new Сравниватель_Int16();
                    }
                    Сравниватели[i] = this.Сравниватель_Int16;
                }
                else if (rt == typeof(ushort))
                {
                    if (this.Сравниватель_UInt16 == null)
                    {
                        this.Сравниватель_UInt16 = new Сравниватель_UInt16();
                    }
                    Сравниватели[i] = this.Сравниватель_UInt16;
                }
                else if (rt == typeof(int))
                {
                    if (this.Сравниватель_Int32 == null)
                    {
                        this.Сравниватель_Int32 = new Сравниватель_Int32();
                    }
                    Сравниватели[i] = this.Сравниватель_Int32;
                }
                else if (rt == typeof(uint))
                {
                    if (this.Сравниватель_UInt32 == null)
                    {
                        this.Сравниватель_UInt32 = new Сравниватель_UInt32();
                    }
                    Сравниватели[i] = this.Сравниватель_UInt32;
                }
                else if (rt == typeof(long))
                {
                    if (this.Сравниватель_Int64 == null)
                    {
                        this.Сравниватель_Int64 = new Сравниватель_Int64();
                    }
                    Сравниватели[i] = this.Сравниватель_Int64;
                }
                else if (rt == typeof(ulong))
                {
                    if (this.Сравниватель_UInt64 == null)
                    {
                        this.Сравниватель_UInt64 = new Сравниватель_UInt64();
                    }
                    Сравниватели[i] = this.Сравниватель_UInt64;
                }
                else if (rt == typeof(decimal))
                {
                    if (this.Сравниватель_Decimal == null)
                    {
                        this.Сравниватель_Decimal = new Сравниватель_Decimal();
                    }
                    Сравниватели[i] = this.Сравниватель_Decimal;
                }
                else if (rt == typeof(string))
                {
                    Сравниватели[i] = this.ObjectCompare;
                }
                i++;
            }
        }
Esempio n. 2
0
        public ФормаТаблицы(Таблица <ТипЗаписи> Таблица, string ЗаголовокФормы = null, ВидОтображениеФормы ОтображениеФормы = ВидОтображениеФормы.Показ)
        {
            InitializeComponent();

            this.Таблица          = Таблица;
            this.ЗаголовокФормы   = ЗаголовокФормы;
            this.ОтображениеФормы = ОтображениеФормы;

            // установка для выбора нескольких вариантов
            if (this.ОтображениеФормы == ВидОтображениеФормы.ВыборНескольких)
            {
                this.listView1.CheckBoxes = true;
            }

            var ОтображаемыеСвойства = Помощник.ПолучитьОтображаемыеСвойства <ТипЗаписи>();

            // установка сортировщика
            this.lvwColumnSorter = new СортировщикКолонок <ТипЗаписи>(ОтображаемыеСвойства);
            this.listView1.ListViewItemSorter = this.lvwColumnSorter;

            // привязка событий к таблице
            this.Таблица.ДобавленаЗапись += new Action <ТипЗаписи, bool>(Таблица_ДобавленаЗапись);
            this.Таблица.УдаленаЗапись   += new Action <ТипЗаписи>(Таблица_УдаленаЗапись);
            this.Таблица.ОбновлёнСтатус  += new Action(Таблица_ОбновлёнСтатус);
            this.Таблица.Обновлено       += new Action(Таблица_Обновлено);
            this.Таблица.ОбновленаЗапись += new Action <ТипЗаписи>(Таблица_ОбновленаЗапись);
            this.Таблица.азрешеноВизуальноеОбновление += new Action <bool>(Таблица_РазрешеноВизуальноеОбновление);
            this.Таблица.ПоказанаЗапись += new Action <ТипЗаписи, bool, bool>(Таблица_ПоказанаЗапись);

            // адаптируем колонки
            foreach (var Свойство in ОтображаемыеСвойства)
            {
                string НазваниеКолонки = ПолучитьНазваниеКолонки(Свойство);
                this.listView1.Columns.Add(НазваниеКолонки).Tag = Свойство;

                if (this.Таблица.Поиск)
                {
                    var ПунктМеню = this.поискToolStripMenuItem.DropDownItems.Add(НазваниеКолонки);
                    ПунктМеню.Tag    = Свойство;
                    ПунктМеню.Click += new EventHandler(this.ПунктМенюПоиска_Click);
                }
            }
            this.listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);

            // адаптируем статус
            foreach (var СвойствоСтатус in this.Таблица.GetType().GetProperties()
                     .ToDictionary(x => x, y => Helper.Attr.BaseMethods.GetOne <СтатусAttribute>(y))
                     .Where(x => x.Value != null))
            {
                var Надпись = new ToolStripStatusLabel();
                Надпись.Tag = new KeyValuePair <PropertyInfo, string>(СвойствоСтатус.Key, string.IsNullOrWhiteSpace(СвойствоСтатус.Value.Подпись) ? СвойствоСтатус.Key.Name : СвойствоСтатус.Value.Подпись);

                // ссылка на изменение
                //if (СвойствоСтатус.Key.CanRead && СвойствоСтатус.Key.CanWrite)
                if (СвойствоСтатус.Value.Изменяемое)
                {
                    Надпись.IsLink = true;
                    Надпись.Click += new EventHandler(this.Надпись_Click);
                }

                this.statusStrip1.Items.Add(Надпись);
            }
            if (this.statusStrip1.Items.Count > 0)
            {
                this.ОбновитьСтатусы();
            }
            else
            {
                // прячем статус
                this.statusStrip1.Visible = false;
                this.listView1.Height    += this.statusStrip1.Height;
            }

            // адаптируем меню
            bool ПунктКонтекстногоМенюПоУмолчаниюУстановлен  = false;
            bool ПунктКонтекстногоМенюПоУмолчаниюУстановлен2 = false;

            // -меняем меню, если таблица показана для выбора
            ToolStripMenuItem ЭлементВерхнегоМеню;

            switch (this.ОтображениеФормы)
            {
            case ВидОтображениеФормы.Выбор:
                // Выбрать
                ЭлементВерхнегоМеню        = new ToolStripMenuItem("Выбрать");
                ЭлементВерхнегоМеню.Font   = new System.Drawing.Font(ЭлементВерхнегоМеню.Font, FontStyle.Bold);
                ЭлементВерхнегоМеню.Click += new EventHandler(ЭлементВерхнегоМеню_Click);
                this.menuStrip1.Items.Insert(this.ИндексВставки++, ЭлементВерхнегоМеню);
                break;

            case ВидОтображениеФормы.ВыборНескольких:
                // Выбрать
                ЭлементВерхнегоМеню        = new ToolStripMenuItem("Выбрать");
                ЭлементВерхнегоМеню.Click += new EventHandler(ЭлементВерхнегоМеню_Click);
                this.menuStrip1.Items.Insert(this.ИндексВставки++, ЭлементВерхнегоМеню);

                var ЭлементКонтекстногогоМеню = new ToolStripMenuItem("Выбрать");
                ЭлементКонтекстногогоМеню.Click += new EventHandler(ЭлементВерхнегоМеню_Click);
                this.contextMenuStrip1.Items.Add(ЭлементКонтекстногогоМеню);

                // отметить все
                ЭлементВерхнегоМеню        = new ToolStripMenuItem("Отметить все");
                ЭлементВерхнегоМеню.Click += new EventHandler(ОтметитьВсе_Click);
                this.menuStrip1.Items.Insert(this.ИндексВставки++, ЭлементВерхнегоМеню);

                ЭлементКонтекстногогоМеню        = new ToolStripMenuItem(ЭлементВерхнегоМеню.Text);
                ЭлементКонтекстногогоМеню.Click += new EventHandler(ОтметитьВсе_Click);
                this.contextMenuStrip1.Items.Add(ЭлементКонтекстногогоМеню);

                // снять все отметки
                ЭлементВерхнегоМеню        = new ToolStripMenuItem("Снять все отметки");
                ЭлементВерхнегоМеню.Click += new EventHandler(СнятьВсеОтметки_Click);
                this.menuStrip1.Items.Insert(this.ИндексВставки++, ЭлементВерхнегоМеню);

                ЭлементКонтекстногогоМеню        = new ToolStripMenuItem(ЭлементВерхнегоМеню.Text);
                ЭлементКонтекстногогоМеню.Click += new EventHandler(СнятьВсеОтметки_Click);
                this.contextMenuStrip1.Items.Add(ЭлементКонтекстногогоМеню);

                // Инвертировать отметки
                ЭлементВерхнегоМеню        = new ToolStripMenuItem("Инвертировать отметки");
                ЭлементВерхнегоМеню.Click += new EventHandler(ИнвертироватьОтметки_Click);
                this.menuStrip1.Items.Insert(this.ИндексВставки++, ЭлементВерхнегоМеню);

                ЭлементКонтекстногогоМеню        = new ToolStripMenuItem(ЭлементВерхнегоМеню.Text);
                ЭлементКонтекстногогоМеню.Click += new EventHandler(ИнвертироватьОтметки_Click);
                this.contextMenuStrip1.Items.Add(ЭлементКонтекстногогоМеню);
                break;

            default:
                foreach (var МетодФункция in this.Таблица.GetType().GetMethods().ToDictionary(x => x, y => Helper.Attr.BaseMethods.GetOne <ФункцияAttribute>(y)).Where(x => x.Value != null))
                {
                    string НазваниеСтатуса = !string.IsNullOrWhiteSpace(МетодФункция.Value.Подпись) ?
                                             МетодФункция.Value.Подпись : МетодФункция.Key.Name;

                    //разбиваем на подменю
                    var Подменю = НазваниеСтатуса.Split('/');

                    if (МетодФункция.Value.ВерхнееМеню)
                    {
                        // ищем/создаём подменю
                        var КоллекцияПоискаПодменю = this.menuStrip1.Items;
                        for (int i = 0; i < Подменю.Count() - 1; i++)
                        {
                            var НайденоеПодменю = КоллекцияПоискаПодменю
                                                  .Cast <ToolStripItem>()
                                                  .Where(x => x.GetType() == typeof(ToolStripMenuItem))
                                                  .Cast <ToolStripMenuItem>()
                                                  .FirstOrDefault(x => x.Text == Подменю[i]);
                            if (НайденоеПодменю == null)
                            {
                                НайденоеПодменю = new ToolStripMenuItem(Подменю[i]);

                                if (i == 0)
                                {
                                    КоллекцияПоискаПодменю.Insert(this.ИндексВставки++, НайденоеПодменю);
                                }
                                else
                                {
                                    КоллекцияПоискаПодменю.Add(НайденоеПодменю);
                                }
                            }

                            КоллекцияПоискаПодменю = НайденоеПодменю.DropDownItems;
                        }
                        НазваниеСтатуса = Подменю.Last();

                        // создаём пункт меню
                        var ЭлементГлавногоМеню = new ToolStripMenuItem(НазваниеСтатуса);
                        ЭлементГлавногоМеню.Tag = МетодФункция.Key;

                        if (!this.Modal && !ПунктКонтекстногоМенюПоУмолчаниюУстановлен2 && МетодФункция.Value.ПоУмолчанию)
                        {
                            ЭлементГлавногоМеню.Font = new Font(ЭлементГлавногоМеню.Font, FontStyle.Bold);
                            ПунктКонтекстногоМенюПоУмолчаниюУстановлен2 = true;
                        }

                        ЭлементГлавногоМеню.Click += new EventHandler(ЭлементГлавногоМеню_Click);

                        if (КоллекцияПоискаПодменю == this.menuStrip1.Items)
                        {
                            КоллекцияПоискаПодменю.Insert(this.ИндексВставки++, ЭлементГлавногоМеню);
                        }
                        else
                        {
                            КоллекцияПоискаПодменю.Add(ЭлементГлавногоМеню);
                        }
                    }

                    if (МетодФункция.Value.КонтекстноеМеню)
                    {
                        // ищем/создаём подменю
                        var КоллекцияПоискаПодменю = this.contextMenuStrip1.Items;
                        for (int i = 0; i < Подменю.Count() - 1; i++)
                        {
                            var НайденоеПодменю = КоллекцияПоискаПодменю
                                                  .Cast <ToolStripItem>()
                                                  .Where(x => x.GetType() == typeof(ToolStripMenuItem))
                                                  .Cast <ToolStripMenuItem>()
                                                  .FirstOrDefault(x => x.Text == Подменю[i]);
                            if (НайденоеПодменю == null)
                            {
                                НайденоеПодменю = new ToolStripMenuItem(Подменю[i]);
                                КоллекцияПоискаПодменю.Add(НайденоеПодменю);
                            }

                            КоллекцияПоискаПодменю = НайденоеПодменю.DropDownItems;
                        }
                        НазваниеСтатуса = Подменю.Last();

                        var ЭлементКонтекстногоМеню = new ToolStripMenuItem(НазваниеСтатуса);
                        ЭлементКонтекстногоМеню.Tag = МетодФункция.Key;

                        if (!this.Modal && !ПунктКонтекстногоМенюПоУмолчаниюУстановлен && МетодФункция.Value.ПоУмолчанию)
                        {
                            ЭлементКонтекстногоМеню.Font = new Font(ЭлементКонтекстногоМеню.Font, FontStyle.Bold);
                            ПунктКонтекстногоМенюПоУмолчаниюУстановлен = true;
                        }
                        else if (МетодФункция.Value.КлавишиВызова != Keys.None)
                        {
                            ЭлементКонтекстногоМеню.ShortcutKeys     = МетодФункция.Value.КлавишиВызова;
                            ЭлементКонтекстногоМеню.ShowShortcutKeys = true;
                        }
                        ЭлементКонтекстногоМеню.Click += new EventHandler(ЭлементГлавногоМеню_Click);
                        КоллекцияПоискаПодменю.Add(ЭлементКонтекстногоМеню);
                    }

                    // скрытая функция
                    if (!МетодФункция.Value.ВерхнееМеню && !МетодФункция.Value.КонтекстноеМеню)
                    {
                        this.СкрытыеФункции.Add(МетодФункция.Value.КлавишиВызова, МетодФункция.Key);
                    }
                }
                break;
            }

            // даём возможность информационной таблице изменить меню
            this.Таблица.ФормированиеМенюЗавершено(this.menuStrip1, this.contextMenuStrip1);

            // если верхнее меню пустое (), то скрываем его
            if (this.menuStrip1.Items.Count == 2 && !this.Таблица.Поиск)
            {
                this.menuStrip1.Visible = false;
                var y = this.listView1.Location.Y;
                this.listView1.Location = new Point(this.listView1.Location.X, 0);
                this.listView1.Height  += y;
            }

            // добавляем в меню "поиск", если нужно
            if (this.Таблица.Поиск)
            {
                ToolStripItem КнопкаПоиска = null;

                // ищем колонку поиска по умолчанию
                // (потом зделать поиск колонки поиска при адаптации колонок)
                foreach (var Свойство in typeof(ТипЗаписи).GetProperties())
                {
                    var АтрибутКолонкиВТаблице = Helper.Attr.BaseMethods.GetOne <КолонкаAttribute>(Свойство);
                    if (АтрибутКолонкиВТаблице != null && АтрибутКолонкиВТаблице.ПоискПоУмолчанию)
                    {
                        var КнопкиМенюПоисков = this.поискToolStripMenuItem.DropDownItems.Cast <ToolStripItem>().Where(x => Свойство.Equals(x.Tag)).Take(1);
                        if (КнопкиМенюПоисков.Count() > 0)
                        {
                            КнопкаПоиска = КнопкиМенюПоисков.First();
                            break;
                        }
                    }
                }

                if (КнопкаПоиска == null)
                {
                    КнопкаПоиска = this.поискToolStripMenuItem.DropDownItems[0];
                }

                // вызываем клик по первому полю поиска
                КнопкаПоиска.PerformClick();
            }
            else
            {
                this.поискToolStripMenuItem.Visible = false;
                this.toolStripTextBox_Поиск.Visible = false;
            }
        }