菜单项的 checkedchange事件,为何比click事件早触发呢?
单击后,才会使菜单项的 checked 属性发生变化呀?然后才触发 checkedchanged事件。
但是,我试了,确实是先触发 checkedchanged事件。然后才是 click事件。不信,大家试一下

解决方案 »

  1.   

    个人觉得:checkedchange事件是当鼠标按下时触发的,而click是鼠标完成按下和放开动作之后触发的
      

  2.   

    应该不是这个原因,因为,我的鼠标按下但不抬起时,checkedchange事件不会触发的。
    但是此时,mousedown事件会触发
      

  3.   


    // 楼主,据我所知,CheckChanged 事件是不会自动触发的,我试过了
    // 楼主是否写了类似于如下的代码:
    private void menuItem_Click(object sender, EventArgs e)
    {
        menuItem.Checked = !menuItem.Checked;
        // ......
    }// 如果是这样的话,CheckChanged 事件先触发,你觉得不合理吗?呵呵
    // Checked 属性改变就会触发 CheckChanged 事件呀。
      

  4.   

    楼上呀,
    菜单项 的 checkedonclick 属性呀。
    设成 true,你试试。
      

  5.   


    // 楼主呀,Reflector 说的很明白了
    protected override void OnClick(EventArgs e)
    {
        if (this.checkOnClick)
        {
            this.Checked = !this.Checked;
        }
        base.OnClick(e);
        if (this.nativeMenuCommandID != -1)
        {
            if ((this.nativeMenuCommandID & 0xf000) != 0)
            {
                UnsafeNativeMethods.PostMessage(new HandleRef(this, this.targetWindowHandle), 0x112, this.nativeMenuCommandID, 0);
            }
            else
            {
                UnsafeNativeMethods.PostMessage(new HandleRef(this, this.targetWindowHandle), 0x111, this.nativeMenuCommandID, 0);
            }
            base.Invalidate();
        }
    }// 你设成 CheckOnClick 只是少费些事,系统帮你做了,否则你自己做,这个我的代码是一个思路。
      

  6.   

    当this.checkOnClick为True,即用户意愿的时候,才做
      

  7.   


    this.Checked = !this.Checked;赋值操作将执行Checked的Setter,如下
    public bool Checked
            {
                get
                {
                    return (this.CheckState != System.Windows.Forms.CheckState.Unchecked);
                }
                set
                {
                    if (value != this.Checked)
                    {
                        this.CheckState = value ? System.Windows.Forms.CheckState.Checked : System.Windows.Forms.CheckState.Unchecked;
                        base.InvokePaint();
                    }
                }
            }
    而Checked的Setter中的this.CheckState =  赋值操作将执行如下:
    base.Properties.SetInteger(PropCheckState, (int) value);
    this.OnCheckedChanged(EventArgs.Empty);
    this.OnCheckStateChanged(EventArgs.Empty);
    查看上面的执行时机,最好才执行base.OnClick(e);
      

  8.   


    是呀,也就是 CheckOnClick 属性为 True 才做。否则就自己设置