单击事件不触发表单上的自定义UserControl

时间:2014-06-04 23:01:48

标签: c# winforms user-controls eventhandler

我创建了一个名为Toggle的UserControl,这是我的代码

[DefaultEvent("Click")]
public partial class Toggle : UserControl {

    public bool ToggleStatus { get { return toggleStatus; } }
    private bool toggleStatus { get; set; }

    public Toggle() {
        InitializeComponent();
        toggleStatus = true;
    }

    private void toggleClick(object sender, EventArgs e) {
        if (toggleStatus) { // currently set as "true" or "on"
            this.lblSwitch.Dock = DockStyle.Right;                
            this.pnlBackground.BackColor = System.Drawing.Color.Red;
            toggleStatus = false;
        } else { // currently set as "false" or "off"
            this.lblSwitch.Dock = DockStyle.Left;                
            this.pnlBackground.BackColor = System.Drawing.Color.Green;
            toggleStatus = true;
        }
    }
}

toggleClick方法与UserControl中控件的点击事件相关联;这火爆就好了。

但是,当我将Toggle控件放在表单上并尝试将事件绑定到单击时,它就不会触发。

    private void toggleSoundClick(object sender, EventArgs e) {
        soundToggle = !soundToggle;
    }

我确保将正确的方法绑定到我的UserControl和我的表单的Designer.cs文件中的click事件

用户控件:

this.lblSwitch.Click += new System.EventHandler(this.toggleClick);
this.pnlBackground.Click += new System.EventHandler(this.toggleClick);

(我把它绑在我的Toggle上的两个控件上,因为无论你在哪里点击控件我想要它都会触发)

形式:

this.tglSound.Click += new System.EventHandler(this.toggleSoundClick);

UserControl的预期行为是触发toggleClick(它会这样做)然后表单应该触发toggleSoundClick(它没有)。我已经看到这种行为适用于我在同一个项目中设计和使用的其他UserControl。

澄清:

我有一个名为ServerDisplay的UserControl。我有一个方法绑定到ServerDisplay的背景面板的Click事件(在ServerDisplay的代码中),它显示了一个随机的MessageBox:

    private void ServerDisplay_Click(object sender, EventArgs e) {
        MessageBox.Show("test");
    }

然后,我的表单中包含ServerDisplay控件。我有一个方法与它的click事件绑定(在我的表单的代码中)

    private void serverDisplayClick(object sender, EventArgs e) {
        if (loaded) {
            ServerDisplay display = (ServerDisplay)sender;
            this.lblLastServer.Text = "Last server joined was " + display.Server.Name + " at " + DateTime.Now.ToString("h:mm tt");
            centerControl(this.lblLastServer);
        }
    } 

当我单击表单中的ServerDisplay控件时,它会显示MessageBox(ServerDisplay中的代码),然后更新我在代码中指定的标签(表单中的代码)。这是预期的行为,但它不适用于我的其他UserControl

1 个答案:

答案 0 :(得分:0)

我终于明白了!我控制设置的方式,我有控件本身,一个面板填满整个背景(我用这个颜色),然后在第一个面板内的另一个面板充当“开关”。

当我摆脱第一个面板并且仅使用控件的背景颜色和开关的小面板时,它在我单击背景时起作用,但是当我单击“开关”面板时它不起作用。我想这会打开更多问题,我将不得不单独提出这个问题,但至少我得到了答案。