Возможно есть другое решение, но я додумался до такого.
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);
}
}