@FlashDok

Как сделать 2 static list одинаковыми, но чтобы ссылались на разные данные в памяти?

Возможно есть другое решение, но я додумался до такого.

1. С MySql я получаю устройства и записываю их в список List.
1.1 List объявлен статическим
public static List<deviceMySql> devices = new List<deviceMySql>();

Чтобы я мог на него ссылатся на прямую без создания его экземпляра.
2. Далее этот список используется как dataSource для datagridview.
2.1 Здесь и начинается проблема т.к у списка и datagridview "двусторонняя" связь, а мне нужно хранить оригинальный не измененный через datagridview список

Если я делаю так
//Список устройств которые были загружены из MySql
        public static List<deviceMySql> devices = new List<deviceMySql>();

        //Список устройств которые были загружены из MySql для datagridview
        public static List<deviceMySql> dgvDevices = new List<deviceMySql>();

и так
devices.Add(device);
                dgvDevices.Add(device);

то оба списка ссылаются на одни и теже данные памяти, и когда в datagridview меняется значение оно меняется в обоих списках.

//Список устройств которые были загружены из MySql
        public static List<deviceMySql> devices = new List<deviceMySql>();

        //Список устройств которые были загружены из MySql для datagridview
        public static List<deviceMySql> dgvDevices = new List<deviceMySql>();

        //Список устройств которые были изменены в dataGridView(MySql)
        public static List<deviceMySql> devicesChange = new List<deviceMySql>();

        //
        public static event Action<int> ProgressUpdated;
        public static async Task loadFromMySqlDevice(MySqlDataReader reader)
        {
            devices.Clear();

            int totalCount = cmdToMySql.loadCountDevice(); // Общее количество элементов
            int processedCount = 0; // Количество обработанных элементов

            while (await reader.ReadAsync())
            {
                var device = new deviceMySql
                {
                    server = reader.GetString("server"),
                    port = reader.GetString("port"),
                    serial = reader.GetString("serial"),
                    imei = reader.GetString("imei"),
                    netAddress = reader.GetString("netAddress"),
                    mobile = reader.GetString("mobile"),
                    address = reader.GetString("address"),
                    mobileoperator = reader.GetString("operator"),
                    model = reader.GetString("model"),
                    producer = reader.GetString("producer")
                };

                devices.Add(device);
                dgvDevices.Add(device);

                processedCount++;
                int progress = (int)((double)processedCount / totalCount * 100);
                ProgressUpdated?.Invoke(progress);
            }

        }
  • Вопрос задан
  • 61 просмотр
Решения вопроса 1
GavriKos
@GavriKos
Дело не в списках, а в том что это один и тот же device. Нужно делать копию device в таком случае. Т.е. вот как то так:

devices.Add(device);
dgvDevices.Add(new deviceMySql(device));


Естественно написав сначала конструктор копирования.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы