还是获取焦点的问题,不过这次不同。
这次是Form中有SplitContainer,左边有TreeView,点击TreeView节点后,在SplitContainer右边加不同的UserControl。加载完UserControl之后,UserControl中的TextBox自动获取焦点。
按照上一篇的做法,运行看不到效果。分析了一下原因,应该是点击了TreeView的某个节点后,焦点还在TreeView内,虽然代码中控制了UserControl的TextBox获得焦点,但实际上UserControl的TextBox没获得焦点,依然无效。找了TreeView的API,也没发现有什么方法,可以让TreeView失去焦点。
于是,头脑风暴,换了种写法。
首先定义一个委托。
delegate void ShowChangeCouponFocus(ChangeCoupon ctl);
ShowChangeCouponFocus ShowChangeCouponFun;
private void FunShowChangeCouponFocus(ChangeCoupon ctl)
{
ctl.Capture = true;
ctl.SetBacodeFocus();
}
其中,ChangeCoupon为自定义的UserControl。ctl.SetBacodeFocus();为UserControl中的自定义方法,用来设置TextBox的焦点。
public void SetBacodeFocus()
{
this.txtBarcode.Focus();
}
然后,在TreeView的AfterSelect做出如下修改
switch(e.Node.Name)
{
case "NodeChangeCoupon":
var ctlChangeCoupon = ChangeCoupon() { Dock = DockStyle.Fill };
this.panelCategory.Controls.Clear();
this.panelCategory.Controls.Add(ctlChangeCoupon);
ShowChangeCouponFun = new ShowChangeCouponFocus(FunShowChangeCouponFocus);
this.BeginInvoke(ShowChangeCouponFun, ctlChangeCoupon);
break;
//.....其他内容
}
仅仅将设置焦点的代码放到了BeginInvoke中执行,在点击TreeView之后,自定义UserControl加载后,TextBox自动获得焦点。
这次是Form中有SplitContainer,左边有TreeView,点击TreeView节点后,在SplitContainer右边加不同的UserControl。加载完UserControl之后,UserControl中的TextBox自动获取焦点。
按照上一篇的做法,运行看不到效果。分析了一下原因,应该是点击了TreeView的某个节点后,焦点还在TreeView内,虽然代码中控制了UserControl的TextBox获得焦点,但实际上UserControl的TextBox没获得焦点,依然无效。找了TreeView的API,也没发现有什么方法,可以让TreeView失去焦点。
于是,头脑风暴,换了种写法。
首先定义一个委托。
delegate void ShowChangeCouponFocus(ChangeCoupon ctl);
ShowChangeCouponFocus ShowChangeCouponFun;
private void FunShowChangeCouponFocus(ChangeCoupon ctl)
{
ctl.Capture = true;
ctl.SetBacodeFocus();
}
其中,ChangeCoupon为自定义的UserControl。ctl.SetBacodeFocus();为UserControl中的自定义方法,用来设置TextBox的焦点。
public void SetBacodeFocus()
{
this.txtBarcode.Focus();
}
然后,在TreeView的AfterSelect做出如下修改
switch(e.Node.Name)
{
case "NodeChangeCoupon":
var ctlChangeCoupon = ChangeCoupon() { Dock = DockStyle.Fill };
this.panelCategory.Controls.Clear();
this.panelCategory.Controls.Add(ctlChangeCoupon);
ShowChangeCouponFun = new ShowChangeCouponFocus(FunShowChangeCouponFocus);
this.BeginInvoke(ShowChangeCouponFun, ctlChangeCoupon);
break;
//.....其他内容
}
仅仅将设置焦点的代码放到了BeginInvoke中执行,在点击TreeView之后,自定义UserControl加载后,TextBox自动获得焦点。