验证未对pict​​urebox的子控件触发的事件

时间:2012-08-01 09:26:21

标签: c# winforms events picturebox validating

昨天我已经为位于WinForm上的组合框中的控件实现了一些验证事件。我已将窗体的AutoValidate属性设置为Disabled,我已将控件的CausesValidation属性设置为true,并实现了控件的Validating事件。通过调用表单的ValidateChildren()方法,我强制执行验证事件。这一切都很好。

但是在将此组合框放在图片框的顶部并将图片框设置为组框的父级之后,则不再执行验证事件....

下面是一些演示代码。表单只包含图片框,分组框,文本框和按钮。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void textBox1_Validating(object sender, CancelEventArgs e)
    {
        MessageBox.Show("Validating textbox");
        e.Cancel = true;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (ValidateChildren())
            MessageBox.Show("Validation not executed :-(");
        else
            MessageBox.Show("Validation executed :-)");
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        groupBox1.Parent = pictureBox1;
    }
}

1 个答案:

答案 0 :(得分:1)

ValidateChildren()方法调用ValidateChildren(ValidationConstraints.Selectable)来完成工作。这对于PictureBox来说是一个问题,它是不可选择的。所以它的孩子都没有得到验证。

使用ValidationConstraints.None调用它也不起作用,验证子控件的能力由ContainerControl实现,而PictureBox不是从它派生的。所以你不能在PictureBox上调用ValidateChildren。自己枚举控件并触发Validating事件也无法工作,PerformControlValidation()方法是内部的。

您需要重新考虑尝试将PictureBox转换为ContainerControl的想法。大多数控件都可以类似于图片框,如果不是通过BackgroundImage属性然后通过Paint事件。