注意, 我做的是一个类似于NumericUpdown的东西——NoLimitNumericUpDown.
这个控件是一个UserControl. 除了底板(就是什么也不放时候的背景)以外有一个UpDown用户控件和一个Textbox控件.UpDown控件包括两个按钮, 一个显示上一个显示下(就像是电梯的一对上下按钮). IDataGridViewEditingControl 已经完整实现. 现在的问题是, 它无法响应焦点离开后自动提交的功能. 就是说如果把这个NoLimitNumericUpDown中的文本框的文字改变, 那么则无法响应消失焦点自动提交的功能. 甚至整个窗体的鼠标按键都无效了. 我打断点看了一下, TextBox 在有焦点的情况下会夺去其父控件的焦点.
但是ESC却可以正常响应.
我看了一下网上的例子, 没有人曾经试过像我这样使用嵌套UserControl来做DataGridViewCellControl的.
DataGirdView.EditEnd、CellClick等等都试过. 在NoLimitNumericUpDown的TextBox值被改以后这些事件不被触发.各位大侠说一下, 怎么办才能实现焦点脱离自动提交的功能! 不胜感激!

解决方案 »

  1.   

    对了……因为USERCONTROL是一种contentcontrol,它可能canfocus的属性不存在或者是设为false的,而你的textbox是可以获得焦点的,那么一旦textbox获得了focus,那么由于usercontrol无法获得焦点,则textbox的焦点是绝对不会转移的。没有焦点,什么editend等需要焦点来发动的事件都没有用。你需要自己写一种方法,让textbox去losefocus,并让需要焦点的控件 setfocus,该通过什么样的事件或者消息来触发方法是你的设计。
      

  2.   

    调用某一控件的 focus() 方法,便可以让处在其它控件上的焦点转移到该控件上。
      

  3.   

    简单地通知DataGridView你的编辑值改变过了,需要提交(用DataGridView.NotifyCurrentCellDirty):class NoLimitNumericUpDownControl : UserControl, IDataGridViewEditingControl 
    {
        int value;    public NoLimitNumericUpDownControl()
        {
            InitializeComponent();
            this.textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
        }    void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (int.TryParse(textBox1.Text, out this.value))
            {
                this.EditingControlValueChanged = true;
                this.EditingControlDataGridView.NotifyCurrentCellDirty(true);   //<----
            }
        }
        //...
    }
      

  4.   


    好想法,通过能获得焦点的textbox的事件来通知主体的datagridview
      

  5.   

    问题查明:
    发生这种灵异事件的原因就是因为DataGridView不支持带有嵌套控件的DataGridViewCell.
      

  6.   

    唉.... 真没治.
    自己用GDI+画吧!
      

  7.   

    可以与WINFORM控件结合使用。不过我想WINFORM也就剩下DATAGRIDVIEW和MSCHART可以留下来用了。
      

  8.   

    用WPF,你让控件长什么样就长什么样。