Почему мой UserControl не сохраняет свою инициализацию?
У меня есть UserControl, для которого, я думаю, я инициализирую некоторых участников:
// MyUserControl.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MyNamespace
{
public partial class MyUserControl : UserControl
{
private string m_myString;
private int m_myInt;
public string MyString
{
get { return m_myString; }
set { m_myString = value; }
}
public int MyInt
{
get { return m_myInt; }
set { m_myInt = value; }
}
public MyUserControl()
{
InitializeComponent();
MyString = ""; // was null, now I think it's ""
MyInt = 5; // was 0, now I think it's 5
}
// .........
}
}
Когда я вставляю этот элемент управления в основную форму и вызываю функцию, которая проверяет значения внутри MyUserControl
вещи не выглядят так, как будто они инициализированы:
// MainForm.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MyProgram
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void MyButton_Click(object sender, EventArgs e)
{
// this prints 0 rather than 5
MessageBox.Show(this.theUserControl.MyInt.ToString());
}
}
}
Я предполагаю, что это действительно простая ошибка, но я не знаю где. Я пытался предугадывать this.
к вещам, но это, вероятно, не способ исправления кода.:)
Спасибо как всегда!
РЕДАКТИРОВАТЬ: Шаг в код дизайнера, как предложил Пит, показал мне, где происходила перезапись. Сначала я вызывал конструктор пользовательского элемента управления, а затем значения перезаписывались значениями по умолчанию. Я не указал никаких значений по умолчанию (предложение Sanjeevakumar Hiremath), поэтому значения по умолчанию были значениями примитивных типов (для int
это было 0).
2 ответа
То, что вы, вероятно, видите здесь, является артефактом дизайнера. Если вы когда-нибудь открыли MainForm
в дизайнере после того, как вы добавили MyUserControl
он, вероятно, записал значения по умолчанию MyUserControl
в сгенерированном InitializeComponent
метод MainForm
, Эти записанные значения переназначаются после конструктора MyUserControl
работает, следовательно, они перезаписывают значения, которые вы установили.
Вы можете контролировать это поведение с помощью DesignerSerializationVisibilityAttribute
Используйте атрибут [DefaultValue]. Позволяет указать значение по умолчанию для свойства элемента управления, если оно не указано в конструкторе.