Изменение значения в коллекции List<> - C#
Формулировка задачи:
Здравствуйте. Относительно недавно открыл для себя удивительный мир коллекций C# и вроде бы все шло гладко. Однако, буквально недавно столкнулся с проблемой:
Тут вот используемая структура:
Обработчик события кнопки Del_button и по совместительству - проблемное место:
Так же есть глобальные(в пределах этого класса) переменные:
Тут DBF - это данные таблицы, включая типы полей, содержимое строк, ячеек и т.д.
ShowRows - это ссылки на строки таблицы DBF, которые НЕ помечены на удаление. Забивается ссылками ShowRows, вот так:
А именно проблему вызывает обработчик события Del_button_Click, эта часть: ChangedRow.Deleted = 42;
после этого присваивания, я ожидаю, что значение переменной DBF.Rows[CurrentRow].Deleted будет равно 42, но вот оно равно 32, как и было. свойство ItsNew = true. Если из свойства ItsNew сделать переменную, то её значение тоже станет "не прикосновенным". Прошу помощи, т.к. моих навыков не хватает =(
Сама задача такая:
Я пишу универсальный вьювер-редактор данных той структуры(здесь это глобальная переменная DBF) и хочу скомпоновать все это дело в вызываемый класс, т.к. периодически нужно в моих проектах редактировать данные dbf-файлов. И каждый раз клепать формочки, с кнопочками и кодом жутко долго.
На данный момент стартующая функция формы принимает значения конфигурации и ref переменную типа DBFTable, удаляются(за исключением досадного недопонимания), добавляются и редактируются строки. Генерируются элементы управления ну и т.д..
public struct DBFTable //Усредненный тип для данных из DBF-файлов { public struct Col { byte T; public char Type { get { return (char)T; } set { switch (value) { case 'B': //DATE chr T = (byte)value; Length = 8; break; case 'C': //Char T = (byte)value; if (Length == 0) MessageBox.Show("Не задана длина типа char в " + HeadName); break; case 'D': //DATE chr T = (byte)value; Length = 8; break; case 'F': //Float T = (byte)value; if (Length == 0) MessageBox.Show("Не задана длина типа float в " + HeadName); break; case 'I': //Int32 T = (byte)value; Length = 4; break; case 'L': //bool T = (byte)value; Length = 1; break; case 'N': //Numeric T = (byte)value; Length = 8; break; case 'O': //DATE chr T = (byte)value; Length = 8; break; case 'Y': //DATE chr T = (byte)value; Length = 8; break; default: MessageBox.Show("Неизвестный тип " + Convert.ToString(value)); break; } } } //Тип ячейки public string HeadName; //Название заголовка public string HeadNewName;//Альтернативное название public byte Length; //Длина заголовка } public byte[] Main; //Перечисление номеров ключевых столбцов public struct Row { public struct Cell { public string Value { set; get; }//Значения ячейки //public public bool Changed { set; get; }//Менялось ли значение ячейки } public bool ItsNew //Новая ли это строка { set { for (int i = 0; i < Cells.Length; i++) Cells[i].Changed = value; } get { for (int i = 0; i < Cells.Length; i++) if (!Cells[i].Changed) return false; return true; } } //Новая-ли это строка*/ //public bool ItsNew; public byte Deleted { set; get; }//Удаленные строки public Cell[] Cells; } public byte KeyCode; //Тип кодировки public string DBFName; //Название dbf-файла public byte Type; //Версия DBF public byte Year; //год изменения public byte Month; //месяц изменения public byte Day; //день изменения public Col[] Columns; //Колонки public List<Row> Rows; //Строки }
private void Del_button_Click(object sender, EventArgs e) //удаление { if (CheckRow()) { int CurrenRow = Grid.CurrentCell.RowIndex; DBFClass.DBFTable.Row ChangedRow = new DBFClass.DBFTable.Row(); ChangedRow = ShowRows[CurrenRow]; //DBF.Rows[CurrenRow] = ChangedRow; //DBFClass.ItemFullDel(ref Grid, ref DBF, ref CurrenRow); ChangedRow.ItsNew = true; ChangedRow.Deleted = 42; //удалено //ShowRows[CurrenRow] = ChangedRow; ShowRows.RemoveAt(CurrenRow); Grid.RowCount = ShowRows.Count; Grid.Refresh(); } ThisText(ref Descrypton_label); }
DBFClass.DBFTable DBF; List<DBFClass.DBFTable.Row> ShowRows;
for (i = 0; i < DBF.Rows.Count; i++) //загружаю только то, что не помечено на удаление if (DBF.Rows[i].Deleted == 32) //42 - удалено, 32 - не удалено ShowRows.Add(DBF.Rows[i]);
Прошу прощения, допустил ошибку, но уже поздно исправлять где она есть.
Вот тут:
"А именно проблему вызывает обработчик события Del_button_Click, эта часть: ChangedRow.Deleted = 42;
после этого присваивания, я ожидаю, что значение переменной DBF.Rows[CurrentRow].Deleted будет равно 42, но вот оно равно 32, как и было. свойство ItsNew = true. Если из свойства ItsNew сделать переменную, то её значение тоже станет "не прикосновенным". Прошу помощи, т.к. моих навыков не хватает =("
надо читать не "DBF.Rows[CurrentRow].Deleted будет равно 42", а "ShowRows[CurrentRow].Deleted будет равно 42(до удаления строки конечно же)"
Стоит добавить, что в глобальной переменной DBF, свойство Deleted тоже не меняется, а вот ItsNew меняется так же как и в ShowRows.
Решение задачи: «Изменение значения в коллекции List<>»
textual
Листинг программы
struct MyPoint { public int x; public int y; } //... static void Main() { MyPoint p1 = new MyPoint(); p1.x = 100; p1.y = 100; MyPoint p2 = p1; p2.x = 900; }