【问题标题】:C# Simplifying a click event method to include other controls [duplicate]C#简化单击事件方法以包含其他控件[重复]
【发布时间】:2017-04-20 07:31:38
【问题描述】:

我希望简化以下操作:单击一个面板,面板将其颜色更改为绿色,如果是绿色,则将其更改回灰色。我想知道如何将控件作为参数写入方法中,这样它就可以适用于任何控件,而不必复制事件方法。

通常:面板点击事件

panel_Click ()
   //some if statement
   panel1.BackColor = green
   panel1.BackColor = gray

然后重复每个控件。取而代之的是,我将创建一个所有控件都订阅的中心方法,该方法读取面板的名称,如下所示:

genericpanel_Click(){
  ChangeColor(thisPanelname);
}

然后这将使用参数/参数:

public void ChangeColor(panel? Mypanel) {
  //some if...
  Mypanel.BackColor = Green
  Mypanel.BackColor = Gray
}

这个伪代码的准确等价物是什么?

编辑:好的,是的,我现在可以看到它是重复的,无需进一步投票。我只是不知道具体要搜索什么。无论如何,我已经找到了答案。

【问题讨论】:

  • 在事件方法中包含object sender参数,将其转换为面板,然后更改其颜色?

标签: c# colors onclick panel


【解决方案1】:

控件的所有事件都提供其源作为第一个参数。您只需要将其转换为正确的类型:

void panel_Click(object sender, EventArgs e) {
    Panel myPanel = (Panel)sender;
    ChangeColor(myPanel);
}

事件处理程序委托的所有定义都提供发送者,例如:

public delegate void EventHandler(object sender, EventArgs e);
public delegate void EventHandler<T>(object sender, T e);

如果您定义自己的事件,只需使用这些委托类型并将事件源作为第一个参数传递。

【讨论】:

    【解决方案2】:

    您可以为所有面板订阅此方法:

    private void panel_Click(object sender, EventArgs e)
    {
        Panel clickedPanel = sender as Panel;
        if ( clickedPanel != null )
        {
            if ( clickedPanel.BackColor == Color.Blue )
            {
                clickedPanel.BackColor = Color.Red;
            }
            else 
            {
                clickedPanel.BackColor = Color.Blue;
            }
        }
    }
    

    如果您只订阅面板,即使第一次检查也不需要,但为了安全起见。

    此方法获取发送者(激活事件的面板)并检查其背景颜色。如果颜色 A 设置为颜色 B -> 否则颜色 A

    【讨论】:

      猜你喜欢
      • 2011-03-10
      • 1970-01-01
      • 2018-07-28
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多