x_g 发表于 2015-9-18 18:17:00

GcDateValidator自动填充日期

使用InputMan的GcDate,给每个日期控件添加了GcDateValidator,使得当日期填的不完整的时候,会自动填充数据,但是只有在按button把光标移开后才会有效果,如果是按键盘上的快捷键,则不能自动填充,请问有什么解决方法吗

Alice 发表于 2015-9-21 18:23:00

回复 1楼x_g的帖子

谢谢反馈。
你的问题我们收到了。
校验后给你反馈,很抱歉给你带来的不便。

Leo 发表于 2015-9-21 18:25:00

通过反射触发一下GcDate的Validating事件应该就可以,参见这段代码
    public partial class Form1 : Form
    {
      public Form1()
      {
            InitializeComponent();

            var shortcuts = this.gcShortcut1.GetShortcuts(gcDate1);
            shortcuts.Add(Keys.Enter, new MethodInvoker(ValidateGcDate));
      }

      public void ValidateGcDate()
      {
            var focusedControl = GetFocusedControl(this) as GrapeCity.Win.Editors.GcDate;
            if (focusedControl == null)
            {
                return;
            }

            MethodInfo mi = focusedControl.GetType().GetMethod("PerformControlValidation", BindingFlags.Instance | BindingFlags.NonPublic);
            if (mi != null)
            {
                mi.Invoke(focusedControl, new object[] { true });
            }
      }

      private static Control GetFocusedControl(Control root)
      {
            if (!root.ContainsFocus)
            {
                return null;
            }
            if (root.Focused)
            {
                return root;
            }

            foreach (var child in root.Controls)
            {
                var focusedControl = GetFocusedControl(child as Control);
                if (focusedControl != null)
                {
                  return focusedControl;
                }
            }

            return null;
      }
    }

x_g 发表于 2015-9-23 10:16:00

回复 3楼Leo的帖子

尝试了您的方法,但是有一点不太理解。
在窗体上增加了GetShortcuts后,GcDateValidator控件好像就无法捕捉到KeyDown事件了,

Leo 发表于 2015-9-23 15:49:00

回复 4楼x_g的帖子

那是因为,GcShortcut有这么个机制,默认情况下,对于自己处理过的快捷键,不再向Control派发,当然还有一个黑科技,以下代码可以无视这个行为:
gcShortcut1.BlockKeyMessage = false;
页: [1]
查看完整版本: GcDateValidator自动填充日期