такой вопрос: есть форма, на ней много текстовых полей. нужно при закрытии формы их сохранить. пока вижу решение сделать клас с полями под поля формы, при закрытии формы присвоить значения полей формы полям класса и класс серилизовать(присвоение поэлементно). есть ли другое решение более универсальное(и простое)?
Здравствуйте, sagent, Вы писали:
Чуть модернизируй этот пример
http://gzip.rsdn.ru/Forum/Message.aspx?mid=355294Автор: Andy77
Дата: 15.08.03
и получишь то, что надо (кстати, там есть комментарий как это сделать — Reflection)
> такой вопрос: есть форма, на ней много текстовых полей. нужно при закрытии формы их сохранить
Надо реализовать в форме интерфейс IXmlSerializable и переопределить метод OnClosing.
Легко можно будет получить, например, вот такой xml.
<SerializableForm size="{Width=300, Height=300}">
<textbox index="1">textbox text 0</textbox>
<textbox index="2">textbox text 1</textbox>
<textbox index="3">textbox text 2</textbox>
<textbox index="4">textbox text 3</textbox>
<textbox index="5">textbox text 4</textbox>
</SerializableForm>
// Реализуем интерфейс
public class SerializableForm : Form,
IXmlSerializable
{
#region IXmlSerializable Members
System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema()
{
return null;
}
void IXmlSerializable.ReadXml(XmlReader reader)
{
// восстановление
// ...
}
// полный контроль над сериализацией
void IXmlSerializable.WriteXml(XmlWriter writer)
{
// свойства формы сохраним как аттрибуты
writer.WriteAttributeString("size", this.Size.ToString());
// для каждого TextBox ...
foreach (Control c in this.Controls)
{
TextBox tb = c as TextBox;
if (tb != null)
{
writer.WriteStartElement("textbox");
writer.WriteAttributeString("index", this.Controls.GetChildIndex(tb).ToString());
writer.WriteString(tb.Text);
writer.WriteEndElement();
}
}
}
#endregion
protected override void OnClosing(CancelEventArgs e)
{
// Вызов сериализации формы
StreamWriter sw = new StreamWriter("Form.xml");
try
{
XmlSerializer xs = new XmlSerializer(this.GetType());
xs.Serialize(sw, frm);
}
finally
{
sw.Close();
}
base.OnClosing(e);
}
}
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Здравствуйте, Mika Soukhov, Вы писали:
MS>Здравствуйте, sagent, Вы писали:
MS>Чуть модернизируй этот пример http://gzip.rsdn.ru/Forum/Message.aspx?mid=355294Автор: Andy77
Дата: 15.08.03
и получишь то, что надо (кстати, там есть комментарий как это сделать — Reflection)
не совсем понял пример. вот что понял-идея это передать текущую форму в сериализатор чтобы тот сохранил значения текстовых полей. так? с рефлекшином не работал-подозреваю с его помощью отбирать на сериализацию токо текстбокс? вот не знаю как реализовать.
В примере постом выше именно эта реализация.
С уважением, Дмитрий.
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Здравствуйте, Mika Soukhov, Вы писали:
MS>Здравствуйте, sagent, Вы писали:
MS>Чуть модернизируй этот пример http://gzip.rsdn.ru/Forum/Message.aspx?mid=355294Автор: Andy77
Дата: 15.08.03
и получишь то, что надо (кстати, там есть комментарий как это сделать — Reflection)
народ нет ли у кого уже готового кода для сохранения всех полей на форме??? прошу помочь
Если не хочешь возиться с сериализацией, и у тебя фиксированное количество полей (я к тому что, этот вариан не очень гибкий), то можешь сделать передачу параметров с помошью делегата. (те если грубо говоря когда форма отработает, вызвать метод родительского класса и передать ему все необходимое, в удобной для тебя форме). Только тут надо быть аккуратным что бы не заблокировать закравающийся поток формы.
... << RSDN@Home 1.1.3 stable >>
Здравствуйте, sagent, Вы писали:
S>такой вопрос: есть форма, на ней много текстовых полей. нужно при закрытии формы их сохранить.
Наверное имеет смысл создать структуру, хранящую содержимое этих полей и привязать ее к элементам управления стандартным байндингом.
... << RSDN@Home 1.1.4 beta 4 rev. 350>>