Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копия класса 
:(
    Опции темы
IEZ
Дата 24.9.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 10.2.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 3



Приветствую Всех!
Есть класс:
Код

class Test
{
        public UInt32 Code;
}


Есть форма (диалог DlgForm), в которой объявлены переменные:
public Object objtest;
Test test=null;

Далее делаю:
Код

Test tnew=null;
Test t=null;
t=new Test();
t.Code=123455;

DlgForm dlg=new DlgForm ();
dlg.objtest=t;
if (dlg.ShowDialog() == DialogResult.OK)
{

}


В самом диалоге (DlgForm_Load(object sender, EventArgs e)) делаю следующее:
Код

DlgForm dialog=(DlgForm)sender;
test=(Test)dialog.objtest;


Далее в диалоге по нажатию кнопки OK заполняю новые данные (к примеру):
Код

test.Code=54321;
dialog.objtest=test;
dialog.DialogResult = DialogResult.OK;


Выйдя из диалога в обработчике DialogResult.OK:
Код

if (dlg.ShowDialog() == DialogResult.OK)
{
tnew=(Test)dlg.objtest; <--- здесь я получаю, что t.Code=54321 и tnew.Code=54321
}


А мне нужно на выходе получить t.Code=12345 и tnew.Code=54321.

Вопрос как мне в диалоге получить копию класса из 
Код

test=(Test)dialog.objtest;

Чтобы при изменение оного не изменялся исходник?
Спасибо.


--------------------
"Нужно делать так, как нужно, а как не нужно, делать не нужно" (с) Винни-Пух.
PM MAIL WWW ICQ   Вверх
Ctrl
Дата 25.9.2008, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 12.2.2008
Где: Tula

Репутация: 6
Всего: 7



Hi
Получить копию класса можно очень многими способами - все зависит от специфических особенностей этого класса и необходимого уровня абстракции при реализации.

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

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Windows.Forms;
using System;

namespace EditObjectCopyTest {
    public partial class TestForm : Form {
        Foo foo;
        public TestForm() {
            InitializeComponent();
            foo = new Foo();
            foo.ID = 12345; // init source object
        }
        private void OnEditButtonClick(object sender, EventArgs e) {
            using (FooEditForm editForm = new FooEditForm(foo)) {
                if (editForm.ShowDialog() == DialogResult.OK) {
                    Foo newValue = (Foo)editForm.EditValue;
                    //.. do something with new value
                }
            }
        }
    }
    //
    [Serializable]
    public class Foo {
        int objID;
        public int ID {
            get { return objID; }
            set { objID = value; }
        }
    }
    public class FooEditForm : BaseEditForm {
        public FooEditForm(Foo foo) : base(foo) { }
        protected override void OnLoad(EventArgs e) {
            base.OnLoad(e);
            ((Foo)EditValue).ID = 54321; //Edit object copy
        }
    }
    public abstract class BaseEditForm : Form {
        object editValueCore;
        protected BaseEditForm(object value) {
            this.editValueCore = MakeEditableCopy(value);
        }
        public object EditValue {
            get { return editValueCore; }
        }
        protected object MakeEditableCopy(object value) {
            object copy=null;
            BinaryFormatter formatter = new BinaryFormatter();
            using(MemoryStream ms = new MemoryStream()){
                formatter.Serialize(ms,value);
                ms.Seek(0, SeekOrigin.Begin);
                copy = formatter.Deserialize(ms);
                ms.Close();
            }
            return copy;
        }
    }
}

PM MAIL ICQ   Вверх
Alekz
Дата 25.9.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 5.2.2008
Где: Запорожье, Украин а

Репутация: 1
Всего: 2



Цитата

Чтобы при изменение оного не изменялся исходник?


Работать с копией.
А в твоем случае легче всего использовать структуры.


Код

if (dlg.ShowDialog() == DialogResult.OK)
{
tnew=(Test)dlg.objtest; <--- здесь я получаю, что t.Code=54321 и tnew.Code=54321
}



Естественно, потому что dlg.objtest содержит ссылку на тот же объект, что и t.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0770 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.