Почему мой 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]. Позволяет указать значение по умолчанию для свойства элемента управления, если оно не указано в конструкторе.

Другие вопросы по тегам