public Form_ЗадатьЗначениеСвойства(PropertyInfo ИнформацияОСвойстве, Таблица ИнфТаблица)
        {
            InitializeComponent();
            this.ИнфТаблица          = ИнфТаблица;
            this.ИнформацияОСвойстве = ИнформацияОСвойстве;


            this.textBox_Значение.Text = Помощник.СвойствоКакСтрока(this.ИнформацияОСвойстве, this.ИнфТаблица);
        }
Пример #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;
            }
        }