Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Событие


Автор: Unsane 11.7.2008, 22:33
Пишу клас, работающий с файлом настроек. Сами настройки хранятся в отдельном объекте. При изменении полей в этом объекте должно запускаться событие, которое будет обрабатывать клас, работающий с файлом настроек.

Делегат:
Код

public delegate void SettingsChangedEventHandler(object sender, SettingsChangedEventArgs e);

Клас, в котором хранятся настройки:
Код

    [XmlRoot("Settings")]
    public class Settings
    {
        public event SettingsChangedEventHandler SettingsChanged;

        private string _Version = "1.0";
        [XmlAttribute("Version")]
        public string Version
        {
            get { return (string)this._Version; }
            set
            {
                this._Version = value;
                SettingsChangedEventArgs e = new SettingsChangedEventArgs();
                OnSettingsChanged(e);
            }
        }

        public Settings() { }

        protected virtual void OnSettingsChanged(SettingsChangedEventArgs e)
        {
            if (SettingsChanged != null)
            {
                SettingsChanged(this, e);
            }
        }
    }


Управляющий класс(ошибка в 9й строке):
Код

    public class SettingsManager
    {
        private string CONFIG_FILE_PATH = Path.GetDirectoryName(System.Windows.Forms.Application.StartupPath) + "//Settings.cfg";
        public Settings Config = null;
                    
        public SettingsManager()
        {
            this.Load();
            this.Config.SettingsChanged += SettingsChangedEventHandler(this.IfChange); // Тут возникает ошибка 'SMTA.SettingsChangedEventHandler' is a 'type' but is used like a 'variable'

        }

        public void Save()
        {
            try
            {
                XmlSerializer xs = new XmlSerializer(this.Config.GetType());
                Stream fs = new FileStream(this.CONFIG_FILE_PATH, FileMode.Create, FileAccess.Write);
                xs.Serialize(fs, this.Config, new XmlSerializerNamespaces(new XmlQualifiedName[] { new XmlQualifiedName(string.Empty) }));
                fs.Close();
            }
            catch { }
        }

        public void Load()
        {
            try
            {
                XmlSerializer xs = new XmlSerializer(typeof(Settings));
                TextReader tr = new StreamReader(new FileStream(this.CONFIG_FILE_PATH, FileMode.Open, FileAccess.Read));
                this.Config = (Settings)xs.Deserialize(tr);
                tr.Close();
            }
            catch { }
            if (this.Config == null)
                this.Config = new Settings();
        }

        private void IfChange(object sender, SettingsChangedEventArgs e)
        {
            this.Save();
        }
    }


С событиями только начал разбираться. Никак не могу понять, как избавиться от ошибки.

з.ы. Надеюсь я не полную дурь написал? smile 

Автор: mihryak 11.7.2008, 23:20
просто
Код

this.Config.SettingsChanged += IfChange;

Автор: Bogdan1024 11.7.2008, 23:38
this.Config.SettingsChanged += new SettingsChangedEventHandler(this.IfChange);
?

Автор: mihryak 12.7.2008, 00:04
Bogdan1024, решарпер традиционно предлагает твой код сократить до моего
та же штука с 
Код

Thread thread = new Thread(ThreadProc);
// вместо
Thread thread = new Thread(new ThreadStart(ThreadProc));


да и вообще с любыми делегатами - можно без создания экземпляра просто передать сам метод

Автор: Bogdan1024 12.7.2008, 00:49
Тоесть, это одно и то же? Ого. Нэ знал smile

Автор: Unsane 12.7.2008, 11:56
Спасибо.. Делал по статье, видимо там из головы код писали, а посмотреть в дизайнере чет не додумался..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)