2015-03-13 2 views
1

Моя проблема проста. Я хочу щелкнуть панель в Form1, это вызовет label1 в userControl1, который помещается на form2, чтобы перейти на «Текст».C#: попытка изменить текстовое поле usercontrol и цвет фона

Нажатие этой панели также изменит цвет фона указанного userControl1. Я получаю сообщение об ошибке «TileInterFaceTest.Usercontrol1.label1» из-за его уровня защиты, что откровенно сбивает меня с толку.

Даже запуск кода изменения цвета отдельно, он просто не достигает желаемого результата.

Чтобы быть ясным, я довольно новичок, когда дело доходит до C# и программирования в целом. Я работаю с Visual Basic до сих пор, поэтому концепция классов, методов и объектов несколько запутывает меня.

Вот мой код:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace TileInterFaceTest 
{ 
    public partial class Form1 : Form 
    { 
     public UserControl1 userControl1 = new UserControl1(); 
     public Form2 form2 = new Form2(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void panel1_Paint(object sender, PaintEventArgs e) 
     { 

     } 

     private void panel1_DoubleClick(object sender, EventArgs e) 
     { 

     } 



     private void panel1_Click(object sender, EventArgs e) 
     { 
      form2.Show(); 
      userControl1.BackColor = System.Drawing.Color.Red; 
      userControl1.label1 = "Text"; 
     } 


    } 
} 
+0

По-прежнему нужна помощь, если кто-либо может. – ShreddedWheat

ответ

1

Во-первых, ваш код, как показано даже не показывать UserControl на первой форме! Вероятно, почему ваш код изменения цвета не сделал, как вы ожидали. Просто писать:

public UserControl1 userControl1 = new UserControl1(); 

Просто объявляет открытое поле (плохой стиль!) И устанавливает его в новый экземпляр вашего пользовательского элемента управления. Не размещайте его на отображаемом UI.

Чтобы исправить эту часть, вы должны добавить ее в свою форму где-нибудь. Скажем ... в конструкторе или Loaded событие:

Controls.Add(userControl1); 

Заметим также, что это ставит его на Form1. Если вы хотите его на Form2, то , что форма должна создать элемент управления и добавить его в свою коллекцию Controls и разоблачить его как свойство (см. Ниже). Другая проблема здесь:

userControl1.label1 = "Text"; 

Предположительно label1 является контроль этикетки на этом пользовательский элемент управления. Прежде всего, элементы управления - private пользователей пользовательского элемента управления, вы не можете просто получить к ним доступ из другого места, не открывая их в первую очередь! Вам необходимо добавить что-то вроде этого в свой пользовательский контроль:

public Label Label1 { get { return label1; } } 

Обратите внимание на использование объекта (правильный стиль!). Теперь вы можете написать это:

userControl1.Label1.Text = "Text"; 

Примечание Я установил окончательную ошибку в этой строке, так как вы не можете установить Label объект в строку, он просто не имеет смысла. Вместо этого вам необходимо изменить его свойство Text.

+0

Я очень ценю это, ошибки синтаксиса были решены. Однако при запуске программы панель на форме1 исчезла. После добавления кнопки в форму с тем же кодом кнопка появляется, но визуально разрезается пополам, нажатие вызывает ошибку «Необработанное исключение типа« System.NullReferenceException »произошло в TileInterFaceTest.exe Дополнительная информация: В экземпляре объекта не задана ссылка на объект." – ShreddedWheat

+1

@ShreddedWheat Вам придется отлаживать это самостоятельно, так как я не вижу код.Если бы мне пришлось догадаться, «разрезать пополам» - это потому, что пользовательский элемент управления накладывается на панель и кнопки. Что касается NRE, прочтите следующее: http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it – BradleyDotNET