GridView.DataSource в DataTable или отделение данных от представления

96
26 апреля 2021, 14:20

У меня есть дефолтный список людей.

  humans = new List<Human>
    {
        new Human{ Name="Вася", Sex = Sex.Male ,Item = Item.Чайная},
        new Human{ Name="ВаНЯ", Sex = Sex.Male ,Item = Item.Чайная}
    };
  public class Human
    {
        public string Name { get; set; }
        public int Count { get; set; }
        public Sex Sex { get; set; }
        public Item Item {get;set;}
    }

Список используется на всех вкладках утилиты отображая по Sex нужные имена(чекбоксы)

Заполняю я ее так dataGridView1.DataSource = humans;

Юзер вводит нужное количество ложек на каждой нужной вкладке. На выходе мне нужно получать файлы.txt.

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

чайная.txt

  1. Вася
  2. Вася
  3. Аня

Наконец Вопрос =)

Нужно использовать несколько datagridview для каждой вкладки? И заполнять каждый dataGridView из humans .И потом каждую выгружать в имя_вкладки.txt.

Я слышал, что отделение данных от представления хорошая практика.

И понял что мои манипуляции в dataGridView , копирование, изменение Cells.Value итд не совсем верное решение.

Тогда я решил что мне надо работать с Datatable и просто добавлять в неё при переходе на новую вкладку новые строки, копируя уже существующие с item = чайная меняя сам Item на столовую в новых, если таковых нет.

И к событию выбора вкладки Столовая

var result = humans.Where(x => x.Item == Item.Столовая)
dataGridView1.DataSource = humans;

Таким образом на каждой вкладке будут отображаться только чайные. либо столовые.Хотя данные все лежат в одной таблице.Кажется это удобно.

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

Но я не знаю как из GridView.DataSource в DataTable эти данные экспортировать. Я пробовал DataTable tbl = Gridview1.DataSource as DataTable; Но получаю Null.

Работать с humans очевидно менее удобно.

Может сразу заполнять из humans DataTable а потом уже указывать ее к DataSource.(Как тогда сделать это?)

А может я вообще изобретаю велосипед.. Как лучше делать?

Answer 1

Пока помогло это

public class ListtoDataTableConverter
        {
            public DataTable ToDataTable<T>(List<T> items)
            {
                DataTable dataTable = new DataTable(typeof(T).Name);
                PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
                foreach (PropertyInfo prop in Props)
                {
                    dataTable.Columns.Add(prop.Name);
                }
                foreach (T item in items)
                {
                    var values = new object[Props.Length];
                    for (int i = 0; i < Props.Length; i++)
                    {
                        values[i] = Props[i].GetValue(item, null);
                    }
                    dataTable.Rows.Add(values);
                }
                return dataTable;
            }
        }
ListtoDataTableConverter converter = new ListtoDataTableConverter();
       DataTable dt = converter.ToDataTable(humans); 
READ ALSO
Обработка события клика мыши, при нажатой клавише на клавиатуре WPF

Обработка события клика мыши, при нажатой клавише на клавиатуре WPF

Нужно обработать клик мыши с зажатой клавишей, к примеру CTRL, по элементу управления КнопкаЯ так понимаю, обрабатываться всё же будем в обработчике...

86
Добавление записей в таблицу по групповым атрибутам

Добавление записей в таблицу по групповым атрибутам

ЗдравствутйеВозник вопрос, так как я чайник, то решил обратиться к вам

103
Вывести итоговый статус за каждый день

Вывести итоговый статус за каждый день

Есть таблица записей с полями datetime(Int) и status(Smallint)Статус может быть 1 - Успех, 2 - Отказ

92