Пользовательский контроль в приложении Windows Forms - PullRequest
1 голос
/ 10 января 2010

У меня есть простой пользовательский элемент управления с текстовым полем и надписью в нем. Я создал общедоступные свойства для доступа к тексту в текстовом поле при использовании пользовательского элемента управления в другой форме.

Моя проблема в том, что свойство возвращает нулевое значение, когда я вызываю его в форме. Я что-то пропустил?

Моя собственность выглядит следующим образом ::

 public partial class UserControl1 : UserControl
 {
        public UserControl1()
        {
            InitializeComponent();
        }

        public string rtnTxtMake
        {  
            get 
            { 
                return txtMake.Text; 
            }
            set 
            { 
                txtMake.Text = value; 
            } 
        }
 }

и в следующем событии нажатия кнопки формы я вызываю свойство следующим образом

        UserControl1 Usc = new UserControl1();
        string Make = Usc.rtnTxtMake;

        MessageBox.Show(Make)

Ответы [ 3 ]

0 голосов
/ 10 января 2010
UserControl1 Usc = new UserControl1();
string Make = Usc.rtnTxtMake;

Если ваш пользовательский элемент управления по умолчанию имеет пустое поле текстового поля, то кажется правильным, что две вышеуказанные строки кода вернут либо null, либо String.Empty (проверьте с помощью String.IsNullOrEmpty), поскольку вы явно создаете новое экземпляр вашего пользовательского контроля.

Я полагаю, что вы действительно хотите это:

  • Вы вставили пользовательский элемент управления в форму в Designer. Давайте назовем этот экземпляр управления пользователя ctlUser.

  • У вас есть кнопка с обработчиком событий Click. Последние несколько строк кода в вашем вопросе взяты из этого метода-обработчика.

  • В обработчике вы не будете создавать новый экземпляр вашего пользовательского элемента управления (Usc), а будете ссылаться на тот, который вы ранее вставили в форму, ctlUser. Тогда все должно работать как положено.

0 голосов
/ 10 января 2010

Что именно вы имеете в виду, когда говорите, что свойство возвращает нулевое значение? Это на самом деле ноль, или ваш MessageBox просто показывает пустой?

Я быстро продублировал ваш код, и он ведет себя точно так, как ожидалось - MessageBox показывает, но он пуст, потому что значением по умолчанию свойства Text элемента управления TextBox является пустая строка.

Кроме того, то, как вы подходите к этому, немного необычно.

Во-первых, строка:

UserControl1 Usc = new UserControl1(); 

Как правило, вам не нужно создавать такой пользовательский элемент управления. Вместо этого вы можете перетащить элемент управления из панели инструментов на поверхность дизайна вашей формы. Тогда это позаботится о создании и инициализации вашего контроля для вас.

Я думаю, что это на самом деле ваша проблема - когда вы включаете строку кода выше, вы создаете новый экземпляр пользовательского элемента управления, а пользовательский элемент управления, который вы перетащили в конструктор, никак не реализуется. .

Если вы перейдете в дизайнерское представление вашей формы и нажмете на пользовательский элемент управления, вы должны увидеть окно свойств где-нибудь здесь. Если вы этого не сделаете, выберите его в меню «Вид» или нажмите F4. В списке свойств должно быть одно «Имя» - это программное имя, сгенерированное для вашего пользовательского элемента управления. Вы можете изменить это здесь, если хотите, но когда вы ссылаетесь на этот элемент управления в остальной части формы, это то, что вы должны использовать.

Во-вторых, следующие две строки:

string Make = Usc.rtnTxtMake;  

MessageBox.Show(Make)  

Вы можете напрямую получить доступ к свойству rtnTxtMake. Если вам позже не понадобится доступ к строке Make в остальной части кода, то прямой доступ к свойству обычно будет считаться лучшим стилем.

MessageBox.Show(userControl.rtnTxtMake);
0 голосов
/ 10 января 2010

Ваш UserControl должен быть добавлен в коллекцию Controls родительской формы / элемента управления, прежде чем он будет правильно инициализирован. Обычно вы не пишете код самостоятельно, который создает и добавляет UserControl.

Вместо этого сначала соберите свой проект, затем перейдите в представление Deisgner вашей основной формы и посмотрите на панель инструментов.

Ваше имя UserControl (и значок) должно отображаться в верхней части панели инструментов, и вы можете просто перетащить его в основную форму. Дизайнер Windows Forms автоматически сгенерирует для вас необходимый код инициализации.

Вы не должны создавать новый экземпляр вашего элемента управления в обработчике событий нажатия кнопки. Используя подход Designer для создания элемента управления, вы можете просто получить доступ к существующему экземпляру элемента управления следующим образом:

public void button_Click(object sender, EventArgs e)
{
    // myUserControl1 has already been created and initialized by the Deisgner generated code
    // Note the name 'myUserControl1' is just an example, yours may be different.
    string controlText=myUserControl1.rtnTxtMake;

    // Or to change the UserControl textbox value
    myUserControl1.rtnTxtMake="Testing";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...