如何在表格之外到达和设置控件的属性?

时间:2013-04-04 15:20:55

标签: c# visual-studio-2010 forms properties controls

我是编程新手,现在正在使用C#Windows Forms应用程序。

问题如下: 我有一个表单,其中包含不同的对象和控件,如:tabpages,textboxes,timers等。 我还有一个UserControl表单,我将其加载到Form的一个主要页面中。

我想在UserControl中编写代码,如何操作主Form的元素属性。

例如:当我单击UserControl表单上的按钮时,它将主窗体的timer.Enabled控件设置为true。

5 个答案:

答案 0 :(得分:4)

可以这样做,但是拥有用户控件访问权限并操纵表单并不是最干净的方式 - 让用户控件引发事件并让托管表单处理事件会更好。 (例如,在处理按钮单击时,表单可以启用/禁用计时器等)

这样,如果需要,您可以以不同的方式使用用户控件用于不同的表单;它使得事情变得更加明显。

更新: 在您的用户控件中,您可以声明一个事件 - 在按钮单击中,您引发事件:

namespace WindowsFormsApplication1
{
    public partial class UserControl1 : UserControl
    {
        public event EventHandler OnButtonClicked;


        public UserControl1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            EventHandler handler = OnButtonClicked;

            // if something is listening for this event, let let them know it has occurred
            if (handler != null)
            {
                handler(this, new EventArgs());
            }

        }
    }
}

然后在表单中添加用户控件。然后你可以加入这个事件:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            userControl11.OnButtonClicked += userControl11_OnButtonClicked;
        }

        void userControl11_OnButtonClicked(object sender, EventArgs e)
        {
            MessageBox.Show("got here");
        }


        }
    }

答案 1 :(得分:1)

您可以将timer1.Modifiers属性设置为“internal”,并使用Form1的实例访问它:

form1.timer1.Enabled = true;

您需要拥有类Form1的实例,而不是类本身。例如:

// INVALID
Form1.timer1.Enabled = true;

// VALID
var form1 = Form1.ActiveForm;
form1.timer1.Enabled = true;

但这不是一个非常干净的方法,你宁愿使用NDJ答案中描述的事件。

答案 2 :(得分:1)

您可能想重新考虑您想要完成的任务。但是,要回答你的问题,可以做到。

最好的方法是在UserControl中创建一个名为MainForm的属性:

public Control MainForm {
    get;
    set;
}

然后,在MainForm的Load事件中,将属性设置为自身:

userControl1.MainForm = this;

最后,在您的用户控件中,设置MainForm的计时器:

protected button_click(object sender, EventArgs e)
{
    timerName = "timer1";
    EnableTimer(timerName);
}

private void EnableTimer(timerName)
{
    var timer = MainForm.Controls.FirstOrDefault(z => z.Name.ToLower().Equals(timerName.ToLower());
    if (timer != null)
    {
         ((Timer)timer).Enabled = true;
    } else {
         // Timer was not found
    }
}

答案 3 :(得分:1)

这很简单。它被称为事件。在用户控件上,您将使用EventHandler公开一个事件,以便表单进行订阅。

public partial class MyUserControl : UserControl
{
    /// You can name the event anything you want.
    public event EventHandler ButtonSelected;

    /// This bubbles the button selected event up to the form.
    private void Button1_Clicked(object sender, EventArgs e)
    {
         if (this.ButtonSelected != null)
         {
              // You could pass your own custom arguments back to the form here.
              this.ButtonSelected(this, e)
         }
    }
}

现在我们有了用户控制代码,我们将在表单代码中实现它。可能在表单的构造函数中,您将获得如下代码。

MyUserControl ctrl = new MyUserControl();
ctrl.ButtonSelected += this.ButtonSelected_OnClick;

最后在表单代码中,您将拥有一个订阅事件的方法,如下面的代码,将Timer设置为true。

private void ButtonSelected_OnClick(object sender, EventArgs e)
{
    this.Timer1.Enabled = true;
}

这就是你如何允许表单上的用户控件上的事件设置表单上的对象。

答案 4 :(得分:0)

您需要输入以下代码,

(`userControl11.OnButtonClicked += userControl11_OnButtonClicked;`) 

在Visual Studio中的单独文件中。另一个文件名为'Form1.Designer.cs',可以在

下的Solution Explorer窗格中找到

Form1 >> Form1.cs >> Form1.Designer.cs

希望这有帮助!