Интерфейс

Просмотр 15 сообщений - с 1 по 15 (из 20 всего)
  • Автор
    Сообщения
  • #21256
    manjey73
    Участник

    Михаил, подскажите, интерфейс в Администраторе это DataGridView ?
    Где смотреть куски кода по добавлению, удалению строк
    Выпадающем списке на столбцах, чекбоксы ?

    В каких библиотеках и места кода, если можно.

    #21257
    Mikhail
    Модератор

    Да, DataGridView. Сама редактируемая таблица — DataTable. Код формы. Форма может ссылаться на другие вспомогательные классы, например, ColumnBuilder

    #21258
    Mikhail
    Модератор

    Ещё более простое использование DataGridView можно посмотреть в Редакторе таблиц.

    #21269
    manjey73
    Участник

    У меня не простое использование 🙁

    при десериализации XML у меня получился вложенный класс. Если просто пихать в DataGridView в одном столбце получается класс, а вот как в столбец загнать переменную из вложенного класса не могу найти даже примеров.

    Имеется ввиду не через цикл, и при этом чтобы при редактировании это потом опять попадало во вложенный класс и сериализовалось…

    #21276
    Mikhail
    Модератор

    Не уверен, что DataGridView так умеет. Можете привести здесь объявление класса?

    #21279
    manjey73
    Участник
    [Serializable]
        public class PlcProjectInfo
        {
            public PlcProjectInfo()
            {
                RoutingInfo = new List<AdsInfo>(); //Список Ads, можно наверное обойтись без списка??????
                Symbols = new List<Symbol>();     // Список Symbol
            }
    
            public List<AdsInfo> RoutingInfo { get; set; }
            public List<Symbol> Symbols { get; set; }           // это позволяет сделать сериализацию без создания соответствующих групп если они пустые
            [XmlIgnore]
            public bool SymbolsSpecified { get { return Symbols.Count != 0; } }
        }
    
        public class AdsInfo
        {
            public AdsInfo() { }
    
            [XmlElement] public string NetId { get; set; }
            [XmlElement] public string Port{ get; set; }
    
            public AdsInfo(string netid, string port)
            {
                NetId = netid;
                Port = port;
            }
        }
    
        public class Symbol
        {
            public Symbol() { }
    
            [XmlIgnore] public string Name1 { get; set; }
            [XmlElement] public Names Name { get; set; }
            [XmlElement] public string Signal { get; set; }
            [XmlElement] public bool Active { get; set; }
            [XmlElement] public string Type { get; set; }
            [XmlElement] public string Comment{ get; set; }
            [XmlElement] public string IGroup { get; set; }
            [XmlElement] public string IOffset { get; set; }
            [XmlElement] public string BitSize { get; set; }
    
            public Symbol(Names names, string signal, bool active, string type, string comment, string igroup, string ioffset, string bitsize)
            {
                Name = names;
                //Name1 = name;
                Signal = signal;
                Active = active;
                Type = type;
                Comment = comment;
                IGroup = igroup;
                IOffset = ioffset;
                BitSize = bitsize;
            }
    
            public class Names
            {
                public Names() { }
                public Names(string name, string Static, string constant, string isDefinedInLibrary, string taskprio)//, string name)
                {
                    Name = name;
                    this.Static = Static;
                    Constant = constant;
                    IsDefinedInLibrary = isDefinedInLibrary;
                    TaskPrio = taskprio;
                }
                [XmlAttribute] public string Static { get; set; }
                [XmlAttribute] public string Constant { get; set; }
                [XmlAttribute] public string IsDefinedInLibrary { get; set; }
                [XmlAttribute] public string TaskPrio { get; set; }
                [XmlText] public string Name { get; set; }
            }
            [XmlIgnore]
            public bool SignalSpecified { get { return Signal != ""; } }
            public bool ActiveSpecified { get { return Active == true; } }
        }
    #21280
    manjey73
    Участник

    Меня собственно интересует Symbol, у меня есть список Symbols из классов Symbol, который имеет вложенный класс Names

    dataGridView1.DataSource = devTemplate.Symbols.GetRange(0, devTemplate.Symbols.Count);

    Таким образом я вижу в dataGridView все текстовые поля и они редактируются и потом сохраняются. Но один из столбцов представляет из себя весь класс Names, а мне нужны переменные из этого класса в столбцах…
    Выглядит это в ячейках столбца так — WinBeckhoffAds.Symbol+Names

    Пока нашел только что нужно создать дополнительный столбец и скрыть этот с классом.
    Каким-то образом связать данные и запихнуть в данный столбец.
    Есть в нете упоминания на DataTable и свойство Expression
    Еще есть какой-то tableadapter
    Но толковых примеров вообще не могу найти, везде примитивы с одним классом и все.

    в текущем xml у меня 898 строк, если все циклами обрабатывать будет некрасиво и долго….

    я могу вытянуть в List нужную переменную, точнее оно вытягивается в IEnumerable и потом ToList(), так как первый не хочет связываться с колонкой. Но как потом все это редактировать, если я строки буду удалять или фильтровать? все циклами проходить? это жесть же….

    • Этот ответ был изменен 1 неделя, 3 дня назад от manjey73.
    #21285
    Mikhail
    Модератор

    Как отобразить такие данные — можно придумать. Но вот как обеспечить их редактирование?
    Возможно, нужно использовать дополнительные PropertyGrid, в которых отображать свойства выбранной строки в DataGridView.

    #21286
    Mikhail
    Модератор

    Либо преобразовать всё в DataTable, а в процессе редактирования изменять свойства своих объектов. Примерно так сделано в Администраторе.

    #21287
    manjey73
    Участник

    BindingSource нужен. В смысле с ним необходимо разобраться, но я никак не могу найти толковых примеров, а собственных мозгов не хватает понять из примитивных примеров как это все делать.

    Вообще я удивлен (или возможно таки есть такая возможность) что dataGridView не может развернуть в плоскость вложенный класс.

    Если посмотреть на класс Symbol то куда мы поместим Names по расположению, тем столбцом он и окажется. Например он у нас второй и у него 3-и переменных.
    Почему datagrid не может показать их так
    Столбец1_______Столбец2______Столбец3______Столбец4______Столбец5
    пер1_класс1____пер1_класс2___пер2_класс2___пер3_класс2___пер3_класс1

    Сейчас переменные класса2, которые являются в общем переменной 2 класса 1 отображаются в одном столбце как класс, я могу вытянуть оттуда переменные в список или IEnumerable но как их загнать в столбец текущего datagridview или с ним связать не понимаю. Добавить столбец я могу, это не проблема, а вот сделать связь бьюсь уже не первый день. Знаю, что это возможно, но вот примеров толковых не нахожу.
    И может у datagridview вдруг есть какое-то свойство, которое автоматом создаст столбцы для вложенного класса?????, тогда вообще никаких проблем нет как скрыть, так и редактировать ячейки.

    #21288
    manjey73
    Участник

    Как вариант сделать две таблицы, связать данные какого-то столбца одной таблицы с другой, чтобы редактирование первой таблицы приводило к изменению во второй.
    И только потом вытягивать в datagridview.

    В общем пока бьюсь с этой темой, так как она для меня новая…

    #21291
    Mikhail
    Модератор

    Ещё можно сделать свой класс, который вытягивает данные в плоский класс, а также обновляет данные в исходных классах по мере изменения. Этот класс должен реализовывать интерфейс INotifyPropertyChanged. Пример

    • Этот ответ был изменен 1 неделя назад от Mikhail.
    #21293
    manjey73
    Участник

    Это уже крайняя мера, если не разберусь с более простой вещью, чем INotify, там вообще непонятно как и что делать..

    #21294
    Mikhail
    Модератор

    Создать свой класс даже более подконтрольно, чем копать грид.

    #21295
    manjey73
    Участник

    Так класс есть актуальный. Хорошо, каким образом происходит копирование данных из одного класса с вложенным в плоский класс и потом обратно ?

Просмотр 15 сообщений - с 1 по 15 (из 20 всего)
  • Вы должны авторизироваться для ответа в этой теме.