我对编程非常陌生,目前正在开发 C# Windows Forms 应用程序。
问题如下:我有一个包含不同对象和控件的表单,例如:标签页、文本框、计时器等。我还有一个 UserControl 表单,我将它加载到主表单的一个标签页中。
我想在 UserControl 中编写代码,如何操作主窗体的元素属性。
例如:当我单击 UserControl 窗体上的按钮时,它将主窗体的 timer.Enabled 控件设置为 true。
我对编程非常陌生,目前正在开发 C# Windows Forms 应用程序。
问题如下:我有一个包含不同对象和控件的表单,例如:标签页、文本框、计时器等。我还有一个 UserControl 表单,我将它加载到主表单的一个标签页中。
我想在 UserControl 中编写代码,如何操作主窗体的元素属性。
例如:当我单击 UserControl 窗体上的按钮时,它将主窗体的 timer.Enabled 控件设置为 true。
可以这样做,但让用户控件访问和操作表单并不是最干净的方式 - 让用户控件引发事件并让托管表单处理事件会更好。(例如在处理按钮点击时,表单可以启用/禁用计时器等)
这样,如果需要,您可以针对不同的表单以不同的方式使用用户控件;它使正在发生的事情变得更加明显。
更新:在您的用户控件中,您可以声明一个事件 - 在按钮单击中,您引发事件:
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");
}
}
}
您可以将timer1.Modifiers
属性设置为“内部”并使用实例访问它Form1
:
form1.timer1.Enabled = true;
您需要有一个类的实例Form1
,而不是类本身。例如:
// INVALID
Form1.timer1.Enabled = true;
// VALID
var form1 = Form1.ActiveForm;
form1.timer1.Enabled = true;
但这不是一种非常干净的方法,您宁愿使用 NDJ 的回答中描述的事件。
您可能想重新考虑您要完成的工作。但是,要回答您的问题,可以这样做。
最好的方法是在你的 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
}
}
这很简单。它被称为事件。在用户控件上,您将使用 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;
}
这就是您允许表单上的用户控件上的事件在表单上设置对象的方式。
您需要输入以下代码,
(`userControl11.OnButtonClicked += userControl11_OnButtonClicked;`)
在 Visual Studio 中的单独文件中。另一个文件称为'Form1.Designer.cs'
,可以在下面的Solution Explorer
窗格中找到
Form1 >> Form1.cs >> Form1.Designer.cs
.
希望这可以帮助!