【问题标题】:Call a button on a C# form through usercontrol通过用户控件调用 C# 表单上的按钮
【发布时间】:2017-04-11 09:25:41
【问题描述】:

我创建了一个带有一些按钮的用户控件。当您单击 UserControl 中的按钮时,按钮的背景颜色会发生变化:

 private void button1(object sender, EventArgs e)
    {
        Control ctrl = ((Control)sender);
        switch (ctrl.BackColor.Name)
        {
            case "Crimson": ctrl.BackColor = Color.Blue; break;
            case "Green": ctrl.BackColor = Color.Orange; break;
            case "Orange": ctrl.BackColor = Color.Crimson; break;
            case "Blue": ctrl.BackColor = Color.Green; break;
            default: ctrl.BackColor = Color.Crimson; break;
        }
    }

在我的表单上是另一个启用的按钮 = false; 因此,当 UserControl 中的颜色发生变化时,我希望表单上的按钮 enabled=true;

【问题讨论】:

  • 那么你可能需要找到一种方法来告诉你的表单你的用户控件中的按钮已经改变了它的背景颜色。也许在您的用户控件中创建一个事件并在您的表单中订阅它?
  • 你的意思是你只以一种形式工作?
  • 我不知道该怎么做
  • 我只以一种形式工作
  • 和同时工作的两个按钮已设置为默认 false

标签: c# winforms user-controls


【解决方案1】:

在您的UserControl 中创建事件处理程序ColorChanged 并在颜色更改时触发该事件。在您的表单中添加事件触发时的侦听器和适当的代码。

所以,在你的控制下,制作EventHandler,像这样

public partial class UserControl1 : UserControl
{
    public EventHandler ColorChanged; 

然后,在您的按钮单击时触发事件,如下所示:

private void button1(object sender, EventArgs e)
{
    ColorChanged?.Invoke(sender, e);
    //rest of your code...
}

在您的表单中,添加监听器:

userControl.ColorChanged += new EventHandler(UserControl_ColorChanged)

并添加将执行的方法并启用按钮...

private void UserControl_ColorChanged(object sender, EventArgs e)
{
    //enable button here
}

【讨论】:

  • userControl.ColorChanged += new EventHandler(UserControl_ColorChanged) 这给了我错误
  • @jellewood 什么样的错误? userControl 应该是您的用户控件的名称。我不知道你是怎么命名的……
  • @jellewoord 我已经编辑了我的答案,忘记了一件事。如果您还没有尝试过这个答案,请立即尝试:)
【解决方案2】:

您可以使用此获取对父表单的引用

Form parentFrm = (this.Parent as Form);

然后,您可以通过公开或通过名称查找控件来访问父窗体上的控件

 Button aButton = (Button)parentFrm.Controls["btnName"];
 if (aButton != null)
     aButton.Enabled = true;

【讨论】:

  • 虽然上面的 Ninos 回答是首选的方法。
【解决方案3】:

您可以使用Event Aggregator 并使用户控件中的按钮发布一个事件并让您的窗口处理该事件

【讨论】:

  • OP 问题是关于 winforms
【解决方案4】:

我是这样解决的;

控制:

public delegate void ColorChangeEventHandler();

public partial class myControl: UserControl
{


    public event ColorChangeEventHandler ColorChanged;

    private void OnColorChange()
    {
        if(ColorChanged != null)
        {
            ColorChanged.Invoke();
        }
    }

    public speelRij()
    {
        InitializeComponent();
    }

  private void Button1_Click(object sender, EventArgs e)
    {
        OnColorChange();
        Control ctrl = ((Control)sender);
        switch (ctrl.BackColor.Name)
        {
            case "Crimson": ctrl.BackColor = Color.Blue; break;
            case "Green": ctrl.BackColor = Color.Orange; break;
            case "Orange": ctrl.BackColor = Color.Crimson; break;
            case "Blue": ctrl.BackColor = Color.Green; break;
            default: ctrl.BackColor = Color.Crimson; break;
        }

表格:

 public myForm()
    {
        InitializeComponent();
        myControl1.ColorChanged += () => { Button1.Enabled = true;};
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    相关资源
    最近更新 更多