Изменение значения в коллекции List<> - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Относительно недавно открыл для себя удивительный мир коллекций C# и вроде бы все шло гладко. Однако, буквально недавно столкнулся с проблемой: Тут вот используемая структура:
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;  //Строки
    }
Обработчик события кнопки Del_button и по совместительству - проблемное место:
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;
Тут DBF - это данные таблицы, включая типы полей, содержимое строк, ячеек и т.д. ShowRows - это ссылки на строки таблицы DBF, которые НЕ помечены на удаление. Забивается ссылками 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) и хочу скомпоновать все это дело в вызываемый класс, т.к. периодически нужно в моих проектах редактировать данные dbf-файлов. И каждый раз клепать формочки, с кнопочками и кодом жутко долго. На данный момент стартующая функция формы принимает значения конфигурации и ref переменную типа DBFTable, удаляются(за исключением досадного недопонимания), добавляются и редактируются строки. Генерируются элементы управления ну и т.д..
Прошу прощения, допустил ошибку, но уже поздно исправлять где она есть. Вот тут: "А именно проблему вызывает обработчик события 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;
}

Оцени полезность:

10   голосов , оценка 4.4 из 5
Похожие ответы